From 3d7d7d44d680bd897a13a901c00cacdfe8d22040 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Sat, 6 Aug 2011 15:23:48 -0400 Subject: [PATCH] Store entries in project settings folder, provider flag and UI --- .../LanguageSettingsSerializableTests.java | 47 ++++++++++++++++++- .../LanguageSettingsSerializable.java | 41 ++++++++++++++-- .../LanguageSettingsProviderTab.java | 31 ++++++++++-- 3 files changed, 110 insertions(+), 9 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java index b65fb14b78b..12c6bb9281f 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java @@ -61,7 +61,8 @@ public class LanguageSettingsSerializableTests extends TestCase { private static final String PROVIDER_NAME_1 = "test.provider.1.name"; private static final String PROVIDER_NAME_2 = "test.provider.2.name"; private static final String CUSTOM_PARAMETER = "custom.parameter"; - + private static final String ATTR_STORE_ENTRIES = "store-entries"; + private static final String VALUE_PROJECT = "project"; private static final String ELEM_TEST = "test"; /** @@ -119,6 +120,11 @@ public class LanguageSettingsSerializableTests extends TestCase { assertEquals(PROVIDER_NAME_2, mockProvider.getName()); mockProvider.setCustomParameter(CUSTOM_PARAMETER); assertEquals(CUSTOM_PARAMETER, mockProvider.getCustomParameter()); + + assertEquals(false, mockProvider.isEntriesStorageWithProject()); + mockProvider.setEntriesStorageWithProject(true); + assertEquals(true, mockProvider.isEntriesStorageWithProject()); + mockProvider.setLanguageScope(languages); assertEquals(languages, mockProvider.getLanguageScope()); mockProvider.setLanguageScope(null); @@ -195,6 +201,31 @@ public class LanguageSettingsSerializableTests extends TestCase { } } + /** + */ + public void testStoreEntriesWithProject() throws Exception { + Element elementProvider; + { + // create provider with custom parameter + LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); + assertEquals(false, provider.isEntriesStorageWithProject()); + provider.setEntriesStorageWithProject(true); + assertEquals(true, provider.isEntriesStorageWithProject()); + + Document doc = XmlUtil.newDocument(); + Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); + elementProvider = provider.serialize(rootElement); + String xmlString = XmlUtil.toString(doc); + assertTrue(xmlString.contains(ATTR_STORE_ENTRIES)); + assertTrue(xmlString.contains(VALUE_PROJECT)); + } + { + // re-load and check custom parameter of the newly loaded provider + LanguageSettingsSerializable provider = new LanguageSettingsSerializable(elementProvider); + assertEquals(true, provider.isEntriesStorageWithProject()); + } + } + /** */ public void testLanguages() throws Exception { @@ -1012,6 +1043,8 @@ public class LanguageSettingsSerializableTests extends TestCase { LanguageSettingsSerializable provider1 = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); provider1.setCustomParameter(CUSTOM_PARAMETER); + assertEquals(false, provider1.isEntriesStorageWithProject()); + provider1.setEntriesStorageWithProject(true); provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2); @@ -1034,6 +1067,12 @@ public class LanguageSettingsSerializableTests extends TestCase { assertFalse(provider1.hashCode()==provider2.hashCode()); provider2.setCustomParameter(CUSTOM_PARAMETER); + assertFalse(provider1.equals(provider2)); + assertFalse(provider1.hashCode()==provider2.hashCode()); + + provider2.setEntriesStorageWithProject(true); + + // All set now, so they should be equal assertTrue(provider1.equals(provider2)); assertTrue(provider1.hashCode()==provider2.hashCode()); @@ -1081,6 +1120,8 @@ public class LanguageSettingsSerializableTests extends TestCase { LanguageSettingsSerializableMock provider1 = new LanguageSettingsSerializableMock(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); provider1.setCustomParameter(CUSTOM_PARAMETER); + assertEquals(false, provider1.isEntriesStorageWithProject()); + provider1.setEntriesStorageWithProject(true); provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); provider1.setSettingEntries(null, null, LANG_ID, sampleEntries_2); @@ -1090,6 +1131,7 @@ public class LanguageSettingsSerializableTests extends TestCase { assertTrue(provider1.equals(providerClone)); assertTrue(provider1.getClass()==providerClone.getClass()); assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter()); + assertEquals(provider1.isEntriesStorageWithProject(), providerClone.isEntriesStorageWithProject()); assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); List actual1 = providerClone.getSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID); @@ -1126,6 +1168,8 @@ public class LanguageSettingsSerializableTests extends TestCase { LanguageSettingsSerializableMock provider1 = new LanguageSettingsSerializableMock(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); provider1.setCustomParameter(CUSTOM_PARAMETER); + assertEquals(false, provider1.isEntriesStorageWithProject()); + provider1.setEntriesStorageWithProject(true); List entries = new ArrayList(); entries.add(new CIncludePathEntry("path", 1)); @@ -1137,6 +1181,7 @@ public class LanguageSettingsSerializableTests extends TestCase { assertFalse(provider1.equals(providerClone)); assertTrue(provider1.getClass()==providerClone.getClass()); assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter()); + assertEquals(provider1.isEntriesStorageWithProject(), providerClone.isEntriesStorageWithProject()); assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); List actual = providerClone.getSettingEntries(null, null, null); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java index 3129996a925..0d0f8aef5ee 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java @@ -1,12 +1,12 @@ /******************************************************************************* - * Copyright (c) 2009, 2010 Andrew Gvozdev (Quoin Inc.) and others. + * Copyright (c) 2009, 2011 Andrew Gvozdev and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Gvozdev (Quoin Inc.) - initial API and implementation + * Andrew Gvozdev - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.language.settings.providers; @@ -45,12 +45,15 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { private static final String ELEM_ENTRY = "entry"; //$NON-NLS-1$ private static final String ATTR_KIND = "kind"; //$NON-NLS-1$ private static final String ATTR_NAME = "name"; //$NON-NLS-1$ + private static final String ATTR_VALUE = "value"; //$NON-NLS-1$ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$ private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$ - private static final String ATTR_VALUE = "value"; //$NON-NLS-1$ - private static final String ELEM_FLAG = "flag"; //$NON-NLS-1$ + private static final String ATTR_STORE_ENTRIES = "store-entries"; //$NON-NLS-1$ + private static final String VALUE_WORKSPACE = "workspace"; //$NON-NLS-1$ + private static final String VALUE_PROJECT = "project"; //$NON-NLS-1$ + private static WeakHashSet> lseListPool = new WeakHashSet>() { @Override public synchronized List add(List list) { @@ -59,6 +62,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { }; + private boolean isEntriesStorageWithProject = false; private Map entries) { if (entries!=null) { Map> langMap = fStorage.get(languageId); @@ -217,6 +240,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { ATTR_NAME, getName(), ATTR_CLASS, getClass().getCanonicalName(), ATTR_PARAMETER, getCustomParameter(), + ATTR_STORE_ENTRIES, isEntriesStorageWithProject() ? VALUE_PROJECT : VALUE_WORKSPACE, }); if (languageScope!=null) { @@ -309,9 +333,12 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID); String providerName = XmlUtil.determineAttributeValue(providerNode, ATTR_NAME); String providerParameter = XmlUtil.determineAttributeValue(providerNode, ATTR_PARAMETER); + String providerStoreEntries = XmlUtil.determineAttributeValue(providerNode, ATTR_STORE_ENTRIES); + this.setId(providerId); this.setName(providerName); this.setCustomParameter(providerParameter); + this.setEntriesStorageWithProject(VALUE_PROJECT.equals(providerStoreEntries)); List settings = new ArrayList(); NodeList nodes = providerNode.getChildNodes(); @@ -456,6 +483,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); result = prime * result + ((languageScope == null) ? 0 : languageScope.hashCode()); result = prime * result + ((customParameter == null) ? 0 : customParameter.hashCode()); + result = prime * result + (isEntriesStorageWithProject ? 0 : 1); result = prime * result + ((fStorage == null) ? 0 : fStorage.hashCode()); result = prime * result + getClass().hashCode(); return result; @@ -503,6 +531,9 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { return false; } else if (!customParameter.equals(other.customParameter)) return false; + + if (isEntriesStorageWithProject!=other.isEntriesStorageWithProject) + return false; if (fStorage == null) { if (other.fStorage != null) 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 750559b9e86..10e1cf6a374 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 @@ -206,6 +206,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { /** * Shortcut for getting the currently selected provider. + * Do not use if you need to change provider's settings, use {@link #getWorkingCopy(String)}. */ private ILanguageSettingsProvider getSelectedProvider() { ILanguageSettingsProvider provider = null; @@ -333,7 +334,7 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { } // Called from globalProviderCheckBox listener - private void toggleGlobalProvider(ILanguageSettingsProvider oldProvider, boolean toGlobal) { + private ILanguageSettingsProvider toggleGlobalProvider(ILanguageSettingsProvider oldProvider, boolean toGlobal) { ILanguageSettingsProvider newProvider = null; String id = oldProvider.getId(); @@ -356,7 +357,11 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { ICConfigurationDescription cfgDescription = getConfigurationDescription(); initializeOptionsPage(newProvider, cfgDescription); displaySelectedOptionPage(); + } else { + newProvider = oldProvider; } + + return newProvider; } private void replaceSelectedProvider(ILanguageSettingsProvider newProvider) { @@ -398,8 +403,10 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { boolean isGlobal = globalProviderCheckBox.getSelection(); ILanguageSettingsProvider provider = getSelectedProvider(); if (isGlobal != LanguageSettingsManager.isWorkspaceProvider(provider)) { - toggleGlobalProvider(provider, isGlobal); + provider = toggleGlobalProvider(provider, isGlobal); } + projectStorageCheckBox.setSelection(provider instanceof LanguageSettingsSerializable + && ((LanguageSettingsSerializable) provider).isEntriesStorageWithProject()); } @Override @@ -410,7 +417,23 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { }); projectStorageCheckBox = new Button(groupOptionsPage, SWT.CHECK); - projectStorageCheckBox.setText("Store entries under project settings folder (supporting project miration)"); + projectStorageCheckBox.setText("Store entries in project settings folder (supporting project miration)"); + projectStorageCheckBox.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + boolean isWithProject = projectStorageCheckBox.getSelection(); + ILanguageSettingsProvider provider = getWorkingCopy(getSelectedProvider().getId()); + Assert.isTrue(provider instanceof LanguageSettingsSerializable); + ((LanguageSettingsSerializable)provider).setEntriesStorageWithProject(isWithProject); + refreshItem(provider); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + widgetSelected(e); + } + + }); linkWorkspacePreferences = createLinkToPreferences(groupOptionsPage, 2); } @@ -581,6 +604,8 @@ public class LanguageSettingsProviderTab extends AbstractCPropertyTab { projectStorageCheckBox.setEnabled(!isGlobal); projectStorageCheckBox.setVisible(rawProvider instanceof LanguageSettingsSerializable); + projectStorageCheckBox.setSelection(provider instanceof LanguageSettingsSerializable + && ((LanguageSettingsSerializable)provider).isEntriesStorageWithProject()); boolean needPreferencesLink=isGlobal && currentOptionsPage!=null; // TODO: message