From ede43fdd0a0986c7d5b42d511c3012cdac6b960d Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Tue, 24 Jan 2012 13:41:09 -0500 Subject: [PATCH] "Restore Defaults" in properties and preferences --- .../LanguageSettingsExtensionManager.java | 6 +- .../LanguageSettingsProvidersSerializer.java | 11 +- .../LanguageSettingsProviderTab.java | 285 +++++++++++++----- .../cdt/internal/ui/newui/Messages.properties | 2 +- 4 files changed, 218 insertions(+), 86 deletions(-) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsExtensionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsExtensionManager.java index d70fb18fd88..9fda16c0ca5 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsExtensionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/language/settings/providers/LanguageSettingsExtensionManager.java @@ -259,8 +259,10 @@ public class LanguageSettingsExtensionManager { * * @param className - class name to instantiate. * @return new instance of language settings provider. + * + * @throws CoreException if not able to create a new instance. */ - /*package*/ static ILanguageSettingsProvider instantiateProviderClass(String className) { + /*package*/ static ILanguageSettingsProvider instantiateProviderClass(String className) throws CoreException { if (className==null || className.equals(LanguageSettingsSerializableProvider.class.getName())) { return new LanguageSettingsSerializableProvider(); } @@ -272,7 +274,7 @@ public class LanguageSettingsExtensionManager { ILanguageSettingsProvider provider = loadProviderFromRegistry(ATTR_CLASS, className, Platform.getExtensionRegistry(), false); if (provider == null) { String msg = "Not able to load provider class=" + className; //$NON-NLS-1$ - CCorePlugin.log(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, msg, new Exception(msg))); + throw new CoreException(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, msg)); } return provider; } 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 eb130a057c9..7e84eca578c 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 @@ -844,7 +844,14 @@ public class LanguageSettingsProvidersSerializer { provider = LanguageSettingsManager.getWorkspaceProvider(providerId); } } else { - provider = loadProvider(providerNode); + try { + provider = loadProvider(providerNode); + } catch (CoreException e) { + @SuppressWarnings("nls") + String msg = "Error loading provider class=[" + providerClass + "] " + + "in project=" + prjDescription.getProject().getName() + ", cfg=[" + cfgId + "]"; + CCorePlugin.log(msg, e); + } if (provider instanceof LanguageSettingsSerializableProvider) { LanguageSettingsSerializableProvider lss = (LanguageSettingsSerializableProvider) provider; if (!isStoringEntriesInProjectArea(lss) && projectElementWsp != null) { @@ -941,7 +948,7 @@ public class LanguageSettingsProvidersSerializer { /** * Load provider from provider node. */ - private static ILanguageSettingsProvider loadProvider(Node providerNode) { + private static ILanguageSettingsProvider loadProvider(Node providerNode) throws CoreException { String attrClass = XmlUtil.determineAttributeValue(providerNode, ATTR_CLASS); ILanguageSettingsProvider provider = LanguageSettingsExtensionManager.instantiateProviderClass(attrClass); 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 cd5611d4de3..67e0b3844e2 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 @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.ui.language.settings.providers; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -117,7 +118,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { private Button enableProvidersCheckBox; private StatusMessageLine fStatusLine; - private Button globalProviderCheckBox = null; + private Button sharedProviderCheckBox = null; private Link linkWorkspacePreferences = null; private Button projectStorageCheckBox = null; @@ -158,10 +159,49 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { return newProvider; } - private static boolean isReconfigured(ILanguageSettingsProvider provider) { - if (provider instanceof ILanguageSettingsEditableProvider) { - return (LanguageSettingsManager.getExtensionProviderIds().contains(provider.getId()) && - ! LanguageSettingsManager.isEqualExtensionProvider(provider, false)); + private boolean isReconfiguredForProject(ILanguageSettingsProvider provider) { + String id = provider.getId(); + + // check for the provider mismatch in configuration list vs. default list from the tool-chain + ICConfigurationDescription cfgDescription = getConfigurationDescription(); + String[] defaultIds = ((ILanguageSettingsProvidersKeeper) cfgDescription).getDefaultLanguageSettingsProvidersIds(); + List providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); + if (Arrays.asList(defaultIds).contains(id) != providers.contains(provider)) { + return true; + } + + // check if "shared" flag matches default shared preference from extension point definition + if (providers.contains(provider) && LanguageSettingsManager.isPreferShared(id) != LanguageSettingsManager.isWorkspaceProvider(provider)) { + return true; + } + + // check if configuration provider equals to the default one from extension point + if (!LanguageSettingsManager.isWorkspaceProvider(provider) && !LanguageSettingsManager.isEqualExtensionProvider(provider, false)) { + return true; + } + return false; + } + + private boolean isEditedForProject(ILanguageSettingsProvider provider) { + String id = provider.getId(); + + // check for the provider mismatch in configuration list vs. initial list + ICConfigurationDescription cfgDescription = getConfigurationDescription(); + List initialProviders = initialProvidersByCfg.get(cfgDescription.getId()); + List providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); + ILanguageSettingsProvider initialProvider = findProvider(id, initialProviders); + if ((initialProvider != null) != providers.contains(provider)) { + return true; + } + + // check if "shared" flag matches that of initial provider + if (providers.contains(provider) && LanguageSettingsManager.isWorkspaceProvider(initialProvider) != LanguageSettingsManager.isWorkspaceProvider(provider)) { + return true; + } + + // check if configuration provider equals to the initial one + if (!LanguageSettingsManager.isWorkspaceProvider(provider) && !provider.equals(initialProvider)) { + return true; } return false; } @@ -171,16 +211,48 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { protected String[] getOverlayKeys(ILanguageSettingsProvider provider) { String[] overlayKeys = super.getOverlayKeys(provider); - ILanguageSettingsProvider rawProvider = page.isForPrefs() ? LanguageSettingsManager.getRawProvider(provider) : provider; - if (isReconfigured(rawProvider)) { - overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_SETTING; + 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)) { + 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; + } + } } - if (isWorkingCopy(provider)) { - overlayKeys[IDecoration.TOP_RIGHT] = CDTSharedImages.IMG_OVR_EDITED; - } return overlayKeys; } + + @Override + public String getText(Object element) { + // AG TODO - address duplication with super.getText() + if (element instanceof ILanguageSettingsProvider) { + ILanguageSettingsProvider provider = (ILanguageSettingsProvider) element; + String name = provider.getName(); + if (name != null) { + if (page.isForPrefs() || isPresentedAsShared(provider)) { + name = name + " [ Shared ]"; + } + return name; + } + String id = provider.getId(); + return "[ Not accessible id="+id+" ]"; + } + return super.getText(element); + } + + } /** @@ -314,24 +386,34 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { int pos = presentedProviders.indexOf(provider); tableProviders.setSelection(pos); - if (event.getChecked() && LanguageSettingsManager.isWorkspaceProvider(provider)) { - if (!LanguageSettingsManager.isPreferShared(provider.getId())) { - // Switch to non-shared provider instance - ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); - if (rawProvider instanceof ILanguageSettingsEditableProvider) { - ILanguageSettingsEditableProvider newProvider = LanguageSettingsManager.getProviderCopy((ILanguageSettingsEditableProvider) rawProvider, false); - if (newProvider != null) { - provider = newProvider; - replaceSelectedProvider(provider); - ICConfigurationDescription cfgDescription = getConfigurationDescription(); - initializeOptionsPage(provider, cfgDescription); - displaySelectedOptionPage(); + if (event.getChecked()) { + if (LanguageSettingsManager.isWorkspaceProvider(provider)) { + if (!LanguageSettingsManager.isPreferShared(provider.getId())) { + // Switch to non-shared provider instance + ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(provider); + if (rawProvider instanceof ILanguageSettingsEditableProvider) { + ILanguageSettingsEditableProvider newProvider = LanguageSettingsManager.getProviderCopy((ILanguageSettingsEditableProvider) rawProvider, false); + if (newProvider != null) { + provider = newProvider; + replaceSelectedProvider(provider); + ICConfigurationDescription cfgDescription = getConfigurationDescription(); + initializeOptionsPage(provider, cfgDescription); + } } } } + } else { + if (!LanguageSettingsManager.isWorkspaceProvider(provider)) { + provider = LanguageSettingsManager.getWorkspaceProvider(provider.getId()); + replaceSelectedProvider(provider); + ICConfigurationDescription cfgDescription = getConfigurationDescription(); + initializeOptionsPage(provider, cfgDescription); + } } + displaySelectedOptionPage(); tableProvidersViewer.update(provider, null); + updateButtons(); }}); createOptionsControl(); @@ -401,9 +483,11 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { if (cfgDescription instanceof ILanguageSettingsProvidersKeeper) { List cfgProviders = new ArrayList(((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders()); pos = getProviderIndex(newProvider.getId(), cfgProviders); - cfgProviders.set(pos, newProvider); - ((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(cfgProviders); - tableProvidersViewer.setCheckedElements(cfgProviders.toArray(new ILanguageSettingsProvider[0])); + if (pos >= 0) { + cfgProviders.set(pos, newProvider); + ((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(cfgProviders); + tableProvidersViewer.setCheckedElements(cfgProviders.toArray(new ILanguageSettingsProvider[0])); + } } } refreshItem(newProvider); @@ -420,13 +504,13 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { groupOptionsPage.setLayout(new GridLayout(2, false)); if (!page.isForPrefs()) { - if (globalProviderCheckBox==null) { - globalProviderCheckBox = new Button(groupOptionsPage, SWT.CHECK); - globalProviderCheckBox.setText("Share setting entries between projects (global provider)"); - globalProviderCheckBox.addSelectionListener(new SelectionAdapter() { + if (sharedProviderCheckBox==null) { + sharedProviderCheckBox = new Button(groupOptionsPage, SWT.CHECK); + sharedProviderCheckBox.setText("Share setting entries between projects (global provider)"); + sharedProviderCheckBox.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - boolean isGlobal = globalProviderCheckBox.getSelection(); + boolean isGlobal = sharedProviderCheckBox.getSelection(); ILanguageSettingsProvider provider = getSelectedProvider(); if (isGlobal != LanguageSettingsManager.isWorkspaceProvider(provider)) { provider = toggleGlobalProvider(provider, isGlobal); @@ -632,9 +716,10 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { boolean isChecked = tableProvidersViewer.getChecked(provider); if (!page.isForPrefs()) { boolean isRawProviderEditable = rawProvider instanceof ILanguageSettingsEditableProvider; - globalProviderCheckBox.setSelection(isGlobal); - globalProviderCheckBox.setEnabled(isChecked && isRawProviderEditable); - globalProviderCheckBox.setVisible(provider!=null); + + sharedProviderCheckBox.setSelection(isPresentedAsShared(provider)); + sharedProviderCheckBox.setEnabled(isChecked && isRawProviderEditable); + sharedProviderCheckBox.setVisible(provider!=null); projectStorageCheckBox.setEnabled(!isGlobal); projectStorageCheckBox.setVisible(rawProvider instanceof LanguageSettingsSerializableProvider); @@ -661,6 +746,18 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { } } + /** + * Checks if the provider should be presented as shared. Unchecked providers are shown as non-shared + * if they are defined as non-shared in extension point even if in fact shared instance is used to display + * the options page. + */ + private boolean isPresentedAsShared(ILanguageSettingsProvider provider) { + ICConfigurationDescription cfgDescription = getConfigurationDescription(); + List providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); + return LanguageSettingsManager.isWorkspaceProvider(provider) && + ( providers.contains(provider) || LanguageSettingsManager.isPreferShared(provider.getId()) ); + } + private void saveCheckedProviders(Object selectedElement) { if (page.isForProject()) { @@ -702,9 +799,9 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { @Override protected void updateButtons() { ILanguageSettingsProvider provider = getSelectedProvider(); - boolean isProviderSelected =provider!=null; + boolean isProviderSelected = provider != null; boolean canForWorkspace = isProviderSelected && page.isForPrefs(); - boolean canForProject = isProviderSelected && page.isForProject() && !LanguageSettingsManager.isWorkspaceProvider(provider); + boolean canForProject = isProviderSelected && page.isForProject(); int pos = tableProviders.getSelectionIndex(); int count = tableProviders.getItemCount(); @@ -715,15 +812,13 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { boolean isAllowedClearing = rawProvider instanceof ILanguageSettingsEditableProvider && LanguageSettingsProviderAssociationManager.isToClear(rawProvider); - boolean canClear = isAllowedClearing && (canForWorkspace || canForProject); + boolean canClear = isAllowedClearing && (canForWorkspace || (canForProject && !LanguageSettingsManager.isWorkspaceProvider(provider))); - boolean canReset = false; - if (rawProvider!=null && (canForWorkspace || canForProject)) { - canReset = ! LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true); - } + boolean canReset = (canForProject && isReconfiguredForProject(provider)) || + (canForWorkspace && (rawProvider instanceof ILanguageSettingsEditableProvider && !LanguageSettingsManager.isEqualExtensionProvider(rawProvider, false))); - boolean canMoveUp = page.isForProject() && isProviderSelected && isRangeOk && pos!=0; - boolean canMoveDown = page.isForProject() && isProviderSelected && isRangeOk && pos!=last; + boolean canMoveUp = canForProject && isRangeOk && pos!=0; + boolean canMoveDown = canForProject && isRangeOk && pos!=last; // buttonSetEnabled(BUTTON_RENAME, false); // buttonSetEnabled(BUTTON_RUN, false); @@ -795,13 +890,51 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { private void performReset(ILanguageSettingsProvider selectedProvider) { String id = selectedProvider.getId(); - ILanguageSettingsProvider newProvider = LanguageSettingsManager.getExtensionProviderCopy(id, true); - if (newProvider == null) { - newProvider = LanguageSettingsManager.getWorkspaceProvider(id); - } - replaceSelectedProvider(newProvider); - + ILanguageSettingsProvider newProvider = null; ICConfigurationDescription cfgDescription = getConfigurationDescription(); + + if (page.isForPrefs()) { + newProvider = LanguageSettingsManager.getExtensionProviderCopy(id, true); + if (newProvider == null) { + newProvider = LanguageSettingsManager.getWorkspaceProvider(id); + } + replaceSelectedProvider(newProvider); + } else { + List providers = ((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders(); + String[] defaultIds = ((ILanguageSettingsProvidersKeeper) cfgDescription).getDefaultLanguageSettingsProvidersIds(); + boolean isDefault = Arrays.asList(defaultIds).contains(id); + + if (isDefault) { + if (!LanguageSettingsManager.isPreferShared(id)) { + newProvider = LanguageSettingsManager.getExtensionProviderCopy(id, true); + } + if (newProvider == null) { + newProvider = LanguageSettingsManager.getWorkspaceProvider(id); + } + if (providers.contains(selectedProvider)) { + // replace provider in the cfg list + replaceSelectedProvider(newProvider); + } else { + // add provider to the cfg list + replaceSelectedProvider(newProvider); + tableProvidersViewer.setChecked(newProvider, true); + saveCheckedProviders(newProvider); + updateProvidersTable(); + refreshItem(newProvider); + } + } else { + if (providers.contains(selectedProvider)) { + // remove provider from the cfg list + newProvider = LanguageSettingsManager.getWorkspaceProvider(id); + replaceSelectedProvider(newProvider); + tableProvidersViewer.setChecked(newProvider, false); + saveCheckedProviders(newProvider); + updateProvidersTable(); + refreshItem(newProvider); + } + } + } + initializeOptionsPage(newProvider, cfgDescription); displaySelectedOptionPage(); updateButtons(); @@ -881,7 +1014,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { @Override protected void performDefaults() { - if (enableProvidersCheckBox==null || enableProvidersCheckBox.getSelection()==false) + if (page.isForProject() && (enableProvidersCheckBox==null || enableProvidersCheckBox.getSelection() == false)) return; if (page.isForPrefs() || page.isForProject()) { @@ -893,49 +1026,39 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { ICConfigurationDescription cfgDescription = getConfigurationDescription(); if (cfgDescription instanceof ILanguageSettingsProvidersKeeper) { List cfgProviders = new ArrayList(((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders()); - boolean atLeastOneChanged = false; - for (int i=0;i newProviders = new ArrayList(defaultIds.length); + for (String id : defaultIds) { + boolean preferShared = LanguageSettingsManager.isPreferShared(id); + ILanguageSettingsProvider newProvider = null; + if (!preferShared) { + newProvider = LanguageSettingsManager.getExtensionProviderCopy(id, true); } + if (newProvider == null) { + newProvider = LanguageSettingsManager.getWorkspaceProvider(id); + } + newProviders.add(newProvider); } - if (atLeastOneChanged) { - ((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(cfgProviders); + + if (!cfgProviders.equals(newProviders)) { + ((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(newProviders); } } } else if (page.isForPrefs()) { - List providers = new ArrayList(presentedProviders); - for (int i=0;i