diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java index 7e84eca578c..14e7077bc25 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsProvidersSerializer.java @@ -100,6 +100,28 @@ public class LanguageSettingsProvidersSerializer { private static ListenerList fLanguageSettingsChangeListeners = new ListenerList(ListenerList.IDENTITY); private static ILock serializingLock = Job.getJobManager().newLock(); + /** + * Dummy class to represent ill-defined provider. + */ + private static class NotAccessibleProvider implements ILanguageSettingsProvider { + private final String id; + private NotAccessibleProvider(String providerId) { + this.id = providerId; + } + @Override + public List getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { + return null; + } + @Override + public String getName() { + return null; + } + @Override + public String getId() { + return id; + } + } + /** * language settings provider listener-cfgDescription association */ @@ -518,7 +540,7 @@ public class LanguageSettingsProvidersSerializer { /** * Load language settings for workspace. */ - public static void loadLanguageSettingsWorkspace() throws CoreException { + public static void loadLanguageSettingsWorkspace() { List providers = null; URI uriStoreWsp = getStoreInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS); @@ -542,7 +564,7 @@ public class LanguageSettingsProvidersSerializer { for (int i = 0; i < providerNodes.getLength(); i++) { Node providerNode = providerNodes.item(i); - String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID); + final String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID); if (userDefinedProvidersIds.contains(providerId)) { String msg = "Ignored an attempt to persist duplicate language settings provider, id=" + providerId; //$NON-NLS-1$ CCorePlugin.log(new Status(IStatus.WARNING, CCorePlugin.PLUGIN_ID, msg, new Exception())); @@ -550,10 +572,16 @@ public class LanguageSettingsProvidersSerializer { } userDefinedProvidersIds.add(providerId); - ILanguageSettingsProvider provider = loadProvider(providerNode); - if (provider != null) { - providers.add(provider); + ILanguageSettingsProvider provider = null; + try { + provider = loadProvider(providerNode); + } catch (Exception e) { + CCorePlugin.log("Error initializing workspace language settings providers", e); //$NON-NLS-1$ } + if (provider == null) { + provider = new NotAccessibleProvider(providerId); + } + providers.add(provider); } } setWorkspaceProvidersInternal(providers); @@ -838,8 +866,8 @@ public class LanguageSettingsProvidersSerializer { provider = LanguageSettingsManager.getExtensionProviderCopy(providerId, true); if (provider == null) { - String msg = "Internal Error trying to copy extension provider id=" + providerId; //$NON-NLS-1$ - CCorePlugin.log(new Status(IStatus.WARNING, CCorePlugin.PLUGIN_ID, msg, new Exception(msg))); + String msg = "Internal Error trying to retrieve copy of extension provider id=" + providerId; //$NON-NLS-1$ + CCorePlugin.log(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, msg, new Exception(msg))); provider = LanguageSettingsManager.getWorkspaceProvider(providerId); } diff --git a/core/org.eclipse.cdt.ui/icons/ovr16/person_ovr.gif b/core/org.eclipse.cdt.ui/icons/ovr16/person_ovr.gif new file mode 100644 index 00000000000..339a6fadc92 Binary files /dev/null and b/core/org.eclipse.cdt.ui/icons/ovr16/person_ovr.gif differ diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsEntriesTab.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsEntriesTab.java index 614ddf2001e..485d0b8ba46 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsEntriesTab.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsEntriesTab.java @@ -512,10 +512,10 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab { boolean isProviderSelected = !isEntrySelected && (provider!=null); boolean isAllowedEditing = provider instanceof ILanguageSettingsEditableProvider - && LanguageSettingsProviderAssociationManager.isToEditEntries(provider); + && LanguageSettingsProviderAssociationManager.isAllowedToEditEntries(provider); boolean isAllowedClearing = provider instanceof ILanguageSettingsEditableProvider - && LanguageSettingsProviderAssociationManager.isToClear(provider); + && LanguageSettingsProviderAssociationManager.isAllowedToClear(provider); boolean canAdd = isAllowedEditing; boolean canEdit = isAllowedEditing && isEntrySelected; @@ -557,7 +557,7 @@ public class LanguageSettingsEntriesTab extends AbstractCPropertyTab { if (status==null || status==Status.OK_STATUS) { ILanguageSettingsProvider provider = getSelectedProvider(); boolean isAllowedEditing = provider instanceof ILanguageSettingsEditableProvider - && LanguageSettingsProviderAssociationManager.isToEditEntries(provider); + && LanguageSettingsProviderAssociationManager.isAllowedToEditEntries(provider); if (!isAllowedEditing) { String msg = "Setting entries for this provider are supplied by system and are not editable."; status = new Status(IStatus.INFO, CUIPlugin.PLUGIN_ID, msg); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderAssociationManager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderAssociationManager.java index eb05886f399..54f8f422721 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderAssociationManager.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderAssociationManager.java @@ -306,7 +306,7 @@ public class LanguageSettingsProviderAssociationManager { * @param provider TODO * @return TODO */ - public static boolean isToClear(ILanguageSettingsProvider provider) { + public static boolean isAllowedToClear(ILanguageSettingsProvider provider) { return getBooleanAttribute(provider, ATTR_UI_CLEAR_ENTRIES); } @@ -315,7 +315,7 @@ public class LanguageSettingsProviderAssociationManager { * @param provider TODO * @return TODO */ - public static boolean isToEditEntries(ILanguageSettingsProvider provider) { + public static boolean isAllowedToEditEntries(ILanguageSettingsProvider provider) { return getBooleanAttribute(provider, ATTR_UI_EDIT_ENTRIES); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderTab.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderTab.java index 67e0b3844e2..a7a80b20d3f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderTab.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/settings/providers/LanguageSettingsProviderTab.java @@ -19,8 +19,6 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.TreeSet; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Assert; @@ -209,24 +207,32 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { private class ProvidersTableLabelProvider extends LanguageSettingsProvidersLabelProvider { @Override protected String[] getOverlayKeys(ILanguageSettingsProvider provider) { + if (provider.getName() == null) { + String[] overlayKeys = new String[5]; + overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_ERROR; + return overlayKeys; + } + + String[] overlayKeys = super.getOverlayKeys(provider); if (page.isForProject()) { - if (isReconfiguredForProject(provider)) { - overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING; - } if (isEditedForProject(provider)) { overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_EDITED; - } - } else if (page.isForPrefs()) { - ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); - if (rawProvider instanceof ILanguageSettingsEditableProvider && !LanguageSettingsManager.isEqualExtensionProvider(rawProvider, false)) { + } else if (!LanguageSettingsManager.getExtensionProviderIds().contains(provider.getId())) { + overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_USER; + } else if (isReconfiguredForProject(provider)) { overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING; } - if (isWorkingCopy(provider)) { - ILanguageSettingsProvider rawInitialProvider = LanguageSettingsManager.getRawProvider(LanguageSettingsManager.getWorkspaceProvider(provider.getId())); - if (!provider.equals(rawInitialProvider)) { - overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_EDITED; + } else if (page.isForPrefs()) { + if (isWorkingCopy(provider) && !provider.equals(LanguageSettingsManager.getRawProvider(LanguageSettingsManager.getWorkspaceProvider(provider.getId())))) { + overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_EDITED; + } else if (!LanguageSettingsManager.getExtensionProviderIds().contains(provider.getId())) { + overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_USER; + } else { + ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); + if (rawProvider instanceof ILanguageSettingsEditableProvider && !LanguageSettingsManager.isEqualExtensionProvider(rawProvider, false)) { + overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING; } } } @@ -633,21 +639,25 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { providers = new ArrayList(); } - List workspaceProviders = LanguageSettingsManager.getWorkspaceProviders(); + List allAvailableProvidersSet = LanguageSettingsManager.getWorkspaceProviders(); // ensure sorting by name all unchecked providers - Set allAvailableProvidersSet = new TreeSet(new Comparator() { + Collections.sort(allAvailableProvidersSet, new Comparator() { @Override public int compare(ILanguageSettingsProvider prov1, ILanguageSettingsProvider prov2) { Boolean isTest1 = prov1.getId().matches(TEST_PLUGIN_ID_PATTERN); Boolean isTest2 = prov2.getId().matches(TEST_PLUGIN_ID_PATTERN); int result = isTest1.compareTo(isTest2); - if (result==0) - result = prov1.getName().compareTo(prov2.getName()); + if (result == 0) { + String name1 = prov1.getName(); + String name2 = prov2.getName(); + if (name1 != null && name2 != null) { + result = name1.compareTo(name2); + } + } return result; } }); - allAvailableProvidersSet.addAll(workspaceProviders); for (ILanguageSettingsProvider provider : allAvailableProvidersSet) { String id = provider.getId(); @@ -809,13 +819,20 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { boolean isRangeOk = pos >= 0 && pos <= last; ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); - boolean isAllowedClearing = rawProvider instanceof ILanguageSettingsEditableProvider - && LanguageSettingsProviderAssociationManager.isToClear(rawProvider); + boolean isAllowedClearing = rawProvider instanceof ILanguageSettingsEditableProvider && rawProvider instanceof LanguageSettingsSerializableProvider + && LanguageSettingsProviderAssociationManager.isAllowedToClear(rawProvider); boolean canClear = isAllowedClearing && (canForWorkspace || (canForProject && !LanguageSettingsManager.isWorkspaceProvider(provider))); + if (rawProvider instanceof LanguageSettingsSerializableProvider) { + canClear = canClear && !((LanguageSettingsSerializableProvider)rawProvider).isEmpty(); + } boolean canReset = (canForProject && isReconfiguredForProject(provider)) || - (canForWorkspace && (rawProvider instanceof ILanguageSettingsEditableProvider && !LanguageSettingsManager.isEqualExtensionProvider(rawProvider, false))); + (canForWorkspace && + (rawProvider instanceof ILanguageSettingsEditableProvider + && !LanguageSettingsManager.isEqualExtensionProvider(rawProvider, false)) + && ( LanguageSettingsManager.getExtensionProviderIds().contains(rawProvider.getId()) ) + ); boolean canMoveUp = canForProject && isRangeOk && pos!=0; boolean canMoveDown = canForProject && isRangeOk && pos!=last; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java index ed6d106d654..ab44e87cc30 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java @@ -240,6 +240,8 @@ public class CDTSharedImages { public static final String IMG_OVR_EDITED = "icons/ovr16/edited_ov.gif"; //$NON-NLS-1$ /** @since 5.4 */ public static final String IMG_OVR_EMPTY = "icons/ovr16/empty_ovr.png"; //$NON-NLS-1$ + /** @since 5.4 */ + public static final String IMG_OVR_USER = "icons/ovr16/person_ovr.gif"; //$NON-NLS-1$ /** * The method finds URL of the image corresponding to the key which could be project-relative path