1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 14:15:23 +02:00

Store entries in project settings folder, provider flag and UI

This commit is contained in:
Andrew Gvozdev 2011-08-06 15:23:48 -04:00
parent 455dfb6541
commit 3d7d7d44d6
3 changed files with 110 additions and 9 deletions

View file

@ -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<ICLanguageSettingEntry> 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<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>();
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<ICLanguageSettingEntry> actual = providerClone.getSettingEntries(null, null, null);

View file

@ -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<List<ICLanguageSettingEntry>> lseListPool = new WeakHashSet<List<ICLanguageSettingEntry>>() {
@Override
public synchronized List<ICLanguageSettingEntry> add(List<ICLanguageSettingEntry> list) {
@ -59,6 +62,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
};
private boolean isEntriesStorageWithProject = false;
private Map<String, // languageId
Map<String, // resource project path
@ -117,11 +121,30 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider {
this.customParameter = customParameter;
}
/**
* Tells if language settings entries are persisted with the project (under .settings folder)
* or in workspace area. Persistence in the project area lets the entries migrate with the
* project.
*
* @return {@code true} if LSE persisted with the project or {@code false} if in the workspace.
*/
public boolean isEntriesStorageWithProject() {
return isEntriesStorageWithProject;
}
/**
* Setter to define where language settings are persisted.
* @param storeEntriesWithProject - {@code true} if with the project,
* {@code false} if in workspace area.
*/
public void setEntriesStorageWithProject(boolean storeEntriesWithProject) {
this.isEntriesStorageWithProject = storeEntriesWithProject;
}
public void clear() {
fStorage.clear();
}
// TODO: look for refactoring this method
private void setSettingEntriesInternal(String rcProjectPath, String languageId, List<ICLanguageSettingEntry> entries) {
if (entries!=null) {
Map<String, List<ICLanguageSettingEntry>> 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<ICLanguageSettingEntry> settings = new ArrayList<ICLanguageSettingEntry>();
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)

View file

@ -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