mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-06 07:45:50 +02:00
ASSIGNED - bug 151850: allow user to specify which parser/language to parse a given content type with
https://bugs.eclipse.org/bugs/show_bug.cgi?id=151850 Combined patch from myself and Jason Montojo
This commit is contained in:
parent
0da5cc01ce
commit
5638a8eeb6
21 changed files with 1329 additions and 214 deletions
|
@ -0,0 +1,29 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 IBM Corporation 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:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.core.language;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.index.tests.IndexTests;
|
||||||
|
import junit.framework.Test;
|
||||||
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author crecoskie
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class AllLanguageTests extends TestSuite {
|
||||||
|
public static Test suite() {
|
||||||
|
TestSuite suite = new IndexTests();
|
||||||
|
|
||||||
|
suite.addTest(LanguageInheritanceTests.suite());
|
||||||
|
|
||||||
|
return suite;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,200 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 IBM Corporation 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:
|
||||||
|
* IBM Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.core.language;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import junit.framework.Test;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.dom.IPDOMManager;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.ILanguage;
|
||||||
|
import org.eclipse.cdt.core.model.LanguageManager;
|
||||||
|
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||||
|
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
||||||
|
import org.eclipse.cdt.internal.core.CContentTypes;
|
||||||
|
import org.eclipse.cdt.internal.index.tests.IndexCompositeTests;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.content.IContentType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for language inheritance computations.
|
||||||
|
*/
|
||||||
|
public class LanguageInheritanceTests extends BaseTestCase {
|
||||||
|
|
||||||
|
private static final String BIN_FOLDER = "bin";
|
||||||
|
private static final String FILE_NAME = "test.c";
|
||||||
|
private static final IContentType[] EMPTY_CONTENT_TYPES = new IContentType[0];
|
||||||
|
|
||||||
|
private ICProject fCProject;
|
||||||
|
private IFile fFile;
|
||||||
|
private LanguageManager fManager;
|
||||||
|
private ILanguage fLanguage1;
|
||||||
|
private ILanguage fLanguage2;
|
||||||
|
|
||||||
|
private IProject fProject;
|
||||||
|
|
||||||
|
public static Test suite() {
|
||||||
|
return suite(LanguageInheritanceTests.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUp() throws Exception {
|
||||||
|
String name = getClass().getName() + "_" + getName();
|
||||||
|
fCProject = CProjectHelper.createCCProject(name , BIN_FOLDER, IPDOMManager.ID_NO_INDEXER);
|
||||||
|
|
||||||
|
fProject = fCProject.getProject();
|
||||||
|
fFile = fProject.getFile(FILE_NAME);
|
||||||
|
|
||||||
|
fManager = LanguageManager.getInstance();
|
||||||
|
fLanguage1 = fManager.getLanguage(GPPLanguage.ID);
|
||||||
|
fLanguage2 = fManager.getLanguage(GCCLanguage.ID);
|
||||||
|
|
||||||
|
// Ensure global language mappings are cleared.
|
||||||
|
WorkspaceLanguageConfiguration config = fManager.getWorkspaceLanguageConfiguration();
|
||||||
|
config.setWorkspaceMappings(Collections.EMPTY_MAP);
|
||||||
|
fManager.storeWorkspaceLanguageConfiguration(EMPTY_CONTENT_TYPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void tearDown() throws Exception {
|
||||||
|
CProjectHelper.delete(fCProject);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDirectFileMapping() throws Exception {
|
||||||
|
ILanguage originalLanguage = fManager.getLanguageForFile(fFile);
|
||||||
|
assertDifferentLanguages(originalLanguage, fLanguage1);
|
||||||
|
|
||||||
|
ProjectLanguageConfiguration config = fManager.getLanguageConfiguration(fCProject.getProject());
|
||||||
|
config.addFileMapping(fFile, GPPLanguage.ID);
|
||||||
|
fManager.storeLanguageMappingConfiguration(fFile);
|
||||||
|
|
||||||
|
assertSameLanguage(fLanguage1, fManager.getLanguageForFile(fFile));
|
||||||
|
|
||||||
|
config.removeFileMapping(fFile);
|
||||||
|
fManager.storeLanguageMappingConfiguration(fFile);
|
||||||
|
|
||||||
|
assertSameLanguage(originalLanguage, fManager.getLanguageForFile(fFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDirectProjectContentTypeMapping() throws Exception {
|
||||||
|
ILanguage originalLanguage = fManager.getLanguageForFile(fFile);
|
||||||
|
assertDifferentLanguages(originalLanguage, fLanguage1);
|
||||||
|
|
||||||
|
String filename = fFile.getLocation().toString();
|
||||||
|
IContentType contentType = CContentTypes.getContentType(fProject, filename);
|
||||||
|
ProjectLanguageConfiguration config = fManager.getLanguageConfiguration(fCProject.getProject());
|
||||||
|
config.addContentTypeMapping(contentType.getId(), GPPLanguage.ID);
|
||||||
|
fManager.storeLanguageMappingConfiguration(fProject, EMPTY_CONTENT_TYPES);
|
||||||
|
|
||||||
|
assertSameLanguage(fLanguage1, fManager.getLanguageForFile(fFile));
|
||||||
|
|
||||||
|
config.removeContentTypeMapping(contentType.getId());
|
||||||
|
fManager.storeLanguageMappingConfiguration(fFile);
|
||||||
|
|
||||||
|
assertSameLanguage(originalLanguage, fManager.getLanguageForFile(fFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDirectWorkspaceContentTypeMapping() throws Exception {
|
||||||
|
ILanguage originalLanguage = fManager.getLanguageForFile(fFile);
|
||||||
|
assertDifferentLanguages(originalLanguage, fLanguage1);
|
||||||
|
|
||||||
|
String filename = fFile.getLocation().toString();
|
||||||
|
IContentType contentType = CContentTypes.getContentType(fProject, filename);
|
||||||
|
WorkspaceLanguageConfiguration config = fManager.getWorkspaceLanguageConfiguration();
|
||||||
|
config.addWorkspaceMapping(contentType.getId(), GPPLanguage.ID);
|
||||||
|
fManager.storeWorkspaceLanguageConfiguration(EMPTY_CONTENT_TYPES);
|
||||||
|
|
||||||
|
assertEquals(fLanguage1, fManager.getLanguageForFile(fFile));
|
||||||
|
|
||||||
|
config.removeWorkspaceMapping(contentType.getId());
|
||||||
|
fManager.storeLanguageMappingConfiguration(fFile);
|
||||||
|
|
||||||
|
assertEquals(originalLanguage, fManager.getLanguageForFile(fFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOverriddenWorkspaceContentTypeMapping1() throws Exception {
|
||||||
|
ILanguage originalLanguage = fManager.getLanguageForFile(fFile);
|
||||||
|
assertDifferentLanguages(originalLanguage, fLanguage1);
|
||||||
|
|
||||||
|
String filename = fFile.getLocation().toString();
|
||||||
|
IContentType contentType = CContentTypes.getContentType(fProject, filename);
|
||||||
|
|
||||||
|
// Set workspace mapping
|
||||||
|
WorkspaceLanguageConfiguration config = fManager.getWorkspaceLanguageConfiguration();
|
||||||
|
config.addWorkspaceMapping(contentType.getId(), GPPLanguage.ID);
|
||||||
|
fManager.storeWorkspaceLanguageConfiguration(EMPTY_CONTENT_TYPES);
|
||||||
|
|
||||||
|
// Override with project mapping
|
||||||
|
ProjectLanguageConfiguration config2 = fManager.getLanguageConfiguration(fCProject.getProject());
|
||||||
|
config2.addContentTypeMapping(contentType.getId(), GCCLanguage.ID);
|
||||||
|
fManager.storeLanguageMappingConfiguration(fProject, EMPTY_CONTENT_TYPES);
|
||||||
|
|
||||||
|
assertSameLanguage(fLanguage2, fManager.getLanguageForFile(fFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOverriddenWorkspaceContentTypeMapping2() throws Exception {
|
||||||
|
ILanguage originalLanguage = fManager.getLanguageForFile(fFile);
|
||||||
|
assertDifferentLanguages(originalLanguage, fLanguage1);
|
||||||
|
|
||||||
|
String filename = fFile.getLocation().toString();
|
||||||
|
IContentType contentType = CContentTypes.getContentType(fProject, filename);
|
||||||
|
|
||||||
|
// Set workspace mapping
|
||||||
|
WorkspaceLanguageConfiguration config = fManager.getWorkspaceLanguageConfiguration();
|
||||||
|
config.addWorkspaceMapping(contentType.getId(), GPPLanguage.ID);
|
||||||
|
fManager.storeWorkspaceLanguageConfiguration(EMPTY_CONTENT_TYPES);
|
||||||
|
|
||||||
|
// Override with file mapping
|
||||||
|
ProjectLanguageConfiguration config2 = fManager.getLanguageConfiguration(fCProject.getProject());
|
||||||
|
config2.addFileMapping(fFile, GCCLanguage.ID);
|
||||||
|
fManager.storeLanguageMappingConfiguration(fFile);
|
||||||
|
|
||||||
|
assertSameLanguage(fLanguage2, fManager.getLanguageForFile(fFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOverriddenProjectContentTypeMapping() throws Exception {
|
||||||
|
ILanguage originalLanguage = fManager.getLanguageForFile(fFile);
|
||||||
|
assertDifferentLanguages(originalLanguage, fLanguage1);
|
||||||
|
|
||||||
|
String filename = fFile.getLocation().toString();
|
||||||
|
IContentType contentType = CContentTypes.getContentType(fProject, filename);
|
||||||
|
|
||||||
|
// Set project mapping
|
||||||
|
ProjectLanguageConfiguration config = fManager.getLanguageConfiguration(fCProject.getProject());
|
||||||
|
config.addContentTypeMapping(contentType.getId(), GPPLanguage.ID);
|
||||||
|
fManager.storeLanguageMappingConfiguration(fProject, EMPTY_CONTENT_TYPES);
|
||||||
|
|
||||||
|
// Override with file mapping
|
||||||
|
ProjectLanguageConfiguration config2 = fManager.getLanguageConfiguration(fCProject.getProject());
|
||||||
|
config2.addFileMapping(fFile, GCCLanguage.ID);
|
||||||
|
fManager.storeLanguageMappingConfiguration(fFile);
|
||||||
|
|
||||||
|
assertSameLanguage(fLanguage2, fManager.getLanguageForFile(fFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void assertSameLanguage(ILanguage expected, ILanguage actual) {
|
||||||
|
if (expected != null) {
|
||||||
|
assertNotNull(actual);
|
||||||
|
assertEquals(expected.getId(), actual.getId());
|
||||||
|
} else {
|
||||||
|
assertNull(actual);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void assertDifferentLanguages(ILanguage language1, ILanguage language2) {
|
||||||
|
assertNotNull(language1);
|
||||||
|
assertNotNull(language2);
|
||||||
|
assertNotSame(language1.getId(), language2.getId());
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,6 +24,7 @@ import junit.framework.TestSuite;
|
||||||
import org.eclipse.cdt.core.cdescriptor.tests.CDescriptorTests;
|
import org.eclipse.cdt.core.cdescriptor.tests.CDescriptorTests;
|
||||||
import org.eclipse.cdt.core.internal.errorparsers.tests.ErrorParserTests;
|
import org.eclipse.cdt.core.internal.errorparsers.tests.ErrorParserTests;
|
||||||
import org.eclipse.cdt.core.internal.tests.PositionTrackerTests;
|
import org.eclipse.cdt.core.internal.tests.PositionTrackerTests;
|
||||||
|
import org.eclipse.cdt.core.language.AllLanguageTests;
|
||||||
import org.eclipse.cdt.core.model.tests.AllCoreTests;
|
import org.eclipse.cdt.core.model.tests.AllCoreTests;
|
||||||
import org.eclipse.cdt.core.model.tests.BinaryTests;
|
import org.eclipse.cdt.core.model.tests.BinaryTests;
|
||||||
import org.eclipse.cdt.core.model.tests.ElementDeltaTests;
|
import org.eclipse.cdt.core.model.tests.ElementDeltaTests;
|
||||||
|
@ -69,6 +70,7 @@ public class AutomatedIntegrationSuite extends TestSuite {
|
||||||
suite.addTest(ElementDeltaTests.suite());
|
suite.addTest(ElementDeltaTests.suite());
|
||||||
suite.addTest(WorkingCopyTests.suite());
|
suite.addTest(WorkingCopyTests.suite());
|
||||||
suite.addTest(PositionTrackerTests.suite());
|
suite.addTest(PositionTrackerTests.suite());
|
||||||
|
suite.addTest(AllLanguageTests.suite());
|
||||||
|
|
||||||
// TODO turning off indexer/search tests until the PDOM
|
// TODO turning off indexer/search tests until the PDOM
|
||||||
// settles. These'll probably have to be rewritten anyway.
|
// settles. These'll probably have to be rewritten anyway.
|
||||||
|
|
|
@ -158,9 +158,9 @@ public class ProjectLanguageConfiguration {
|
||||||
* Replaces the existing file-specific language mappings with the given
|
* Replaces the existing file-specific language mappings with the given
|
||||||
* mappings. The given mappings should be between full paths
|
* mappings. The given mappings should be between full paths
|
||||||
* (<code>String</code>) and language ids (<code>String</code>)
|
* (<code>String</code>) and language ids (<code>String</code>)
|
||||||
* @param projectMappings
|
* @param fileMappings
|
||||||
*/
|
*/
|
||||||
public void setFileMappings(Map/*<String, String>*/ fileMappings) {
|
public void setFileMappings(Map/*<String, String>*/ fileMappings) {
|
||||||
fContentTypeMappings = new TreeMap(fileMappings);
|
fFileMappings = new TreeMap(fileMappings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.eclipse.cdt.core.dom.ILinkage;
|
||||||
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
||||||
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
|
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
|
||||||
import org.eclipse.cdt.internal.core.CContentTypes;
|
import org.eclipse.cdt.internal.core.CContentTypes;
|
||||||
|
import org.eclipse.cdt.internal.core.language.LanguageMappingResolver;
|
||||||
import org.eclipse.cdt.internal.core.language.LanguageMappingStore;
|
import org.eclipse.cdt.internal.core.language.LanguageMappingStore;
|
||||||
import org.eclipse.cdt.internal.core.model.LanguageDescriptor;
|
import org.eclipse.cdt.internal.core.model.LanguageDescriptor;
|
||||||
import org.eclipse.cdt.internal.core.model.TranslationUnit;
|
import org.eclipse.cdt.internal.core.model.TranslationUnit;
|
||||||
|
@ -67,6 +68,7 @@ public class LanguageManager {
|
||||||
private HashMap fIdToLanguageDescriptorCache;//= new HashMap();
|
private HashMap fIdToLanguageDescriptorCache;//= new HashMap();
|
||||||
private HashMap fContentTypeToDescriptorListCache;
|
private HashMap fContentTypeToDescriptorListCache;
|
||||||
private ListenerList fLanguageChangeListeners = new ListenerList(ListenerList.IDENTITY);
|
private ListenerList fLanguageChangeListeners = new ListenerList(ListenerList.IDENTITY);
|
||||||
|
private WorkspaceLanguageConfiguration fWorkspaceMappings;
|
||||||
|
|
||||||
public static LanguageManager getInstance() {
|
public static LanguageManager getInstance() {
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
|
@ -373,8 +375,15 @@ public class LanguageManager {
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public WorkspaceLanguageConfiguration getWorkspaceLanguageConfiguration() throws CoreException {
|
public WorkspaceLanguageConfiguration getWorkspaceLanguageConfiguration() throws CoreException {
|
||||||
// TODO: Implement this.
|
synchronized (this) {
|
||||||
return new WorkspaceLanguageConfiguration();
|
if (fWorkspaceMappings != null) {
|
||||||
|
return fWorkspaceMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
LanguageMappingStore store = new LanguageMappingStore();
|
||||||
|
fWorkspaceMappings = store.decodeWorkspaceMappings();
|
||||||
|
return fWorkspaceMappings;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -385,7 +394,20 @@ public class LanguageManager {
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public void storeWorkspaceLanguageConfiguration(IContentType[] affectedContentTypes) throws CoreException {
|
public void storeWorkspaceLanguageConfiguration(IContentType[] affectedContentTypes) throws CoreException {
|
||||||
// TODO: Implement this.
|
synchronized (this) {
|
||||||
|
if (fWorkspaceMappings == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LanguageMappingStore store = new LanguageMappingStore();
|
||||||
|
store.storeMappings(fWorkspaceMappings);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify listeners that the language mappings have changed.
|
||||||
|
LanguageMappingChangeEvent event = new LanguageMappingChangeEvent();
|
||||||
|
event.setType(LanguageMappingChangeEvent.TYPE_WORKSPACE);
|
||||||
|
event.setAffectedContentTypes(affectedContentTypes);
|
||||||
|
notifyLanguageChangeListeners(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -402,8 +424,8 @@ public class LanguageManager {
|
||||||
return mappings;
|
return mappings;
|
||||||
}
|
}
|
||||||
|
|
||||||
LanguageMappingStore store = new LanguageMappingStore(project);
|
LanguageMappingStore store = new LanguageMappingStore();
|
||||||
mappings = store.decodeMappings();
|
mappings = store.decodeMappings(project);
|
||||||
fLanguageConfigurationCache.put(project, mappings);
|
fLanguageConfigurationCache.put(project, mappings);
|
||||||
return mappings;
|
return mappings;
|
||||||
}
|
}
|
||||||
|
@ -419,11 +441,18 @@ public class LanguageManager {
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public void storeLanguageMappingConfiguration(IProject project, IContentType[] affectedContentTypes) throws CoreException {
|
public void storeLanguageMappingConfiguration(IProject project, IContentType[] affectedContentTypes) throws CoreException {
|
||||||
ProjectLanguageConfiguration mappings = (ProjectLanguageConfiguration) fLanguageConfigurationCache.get(project);
|
synchronized (this) {
|
||||||
LanguageMappingStore store = new LanguageMappingStore(project);
|
ProjectLanguageConfiguration mappings = (ProjectLanguageConfiguration) fLanguageConfigurationCache.get(project);
|
||||||
store.storeMappings(mappings);
|
LanguageMappingStore store = new LanguageMappingStore();
|
||||||
|
store.storeMappings(project, mappings);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Notify listeners that the language mappings have changed.
|
// Notify listeners that the language mappings have changed.
|
||||||
|
LanguageMappingChangeEvent event = new LanguageMappingChangeEvent();
|
||||||
|
event.setType(LanguageMappingChangeEvent.TYPE_PROJECT);
|
||||||
|
event.setProject(project);
|
||||||
|
event.setAffectedContentTypes(affectedContentTypes);
|
||||||
|
notifyLanguageChangeListeners(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -448,7 +477,7 @@ public class LanguageManager {
|
||||||
|
|
||||||
String contentTypeID = contentType.getId();
|
String contentTypeID = contentType.getId();
|
||||||
|
|
||||||
return computeLanguage(project, fullPathToFile, contentTypeID);
|
return LanguageMappingResolver.computeLanguage(project, fullPathToFile, contentTypeID, false)[0].language;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -492,7 +521,7 @@ public class LanguageManager {
|
||||||
contentTypeID= ct.getId();
|
contentTypeID= ct.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
return computeLanguage(project, pathToFile.toPortableString(), contentTypeID);
|
return LanguageMappingResolver.computeLanguage(project, pathToFile.toPortableString(), contentTypeID, false)[0].language;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -527,34 +556,7 @@ public class LanguageManager {
|
||||||
contentTypeId= contentType.getId();
|
contentTypeId= contentType.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
return computeLanguage(project, file.getProjectRelativePath().toPortableString(), contentTypeId);
|
return LanguageMappingResolver.computeLanguage(project, file.getProjectRelativePath().toPortableString(), contentTypeId, false)[0].language;
|
||||||
}
|
|
||||||
|
|
||||||
private ILanguage computeLanguage(IProject project, String filePath, String contentTypeId) throws CoreException {
|
|
||||||
ProjectLanguageConfiguration mappings = getLanguageConfiguration(project);
|
|
||||||
if (mappings != null) {
|
|
||||||
// File-level mappings
|
|
||||||
String id = mappings.getLanguageForFile(filePath);
|
|
||||||
if (id != null) {
|
|
||||||
return getLanguage(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Project-level mappings
|
|
||||||
id = mappings.getLanguageForContentType(contentTypeId);
|
|
||||||
if (id != null) {
|
|
||||||
return getLanguage(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Workspace mappings
|
|
||||||
WorkspaceLanguageConfiguration workspaceMappings = getWorkspaceLanguageConfiguration();
|
|
||||||
String id = workspaceMappings.getLanguageForContentType(contentTypeId);
|
|
||||||
if (id != null) {
|
|
||||||
return getLanguage(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content type mappings
|
|
||||||
return getLanguageForContentTypeID(contentTypeId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -601,8 +603,8 @@ public class LanguageManager {
|
||||||
IProject project = file.getProject();
|
IProject project = file.getProject();
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
ProjectLanguageConfiguration mappings = (ProjectLanguageConfiguration) fLanguageConfigurationCache.get(project);
|
ProjectLanguageConfiguration mappings = (ProjectLanguageConfiguration) fLanguageConfigurationCache.get(project);
|
||||||
LanguageMappingStore store = new LanguageMappingStore(project);
|
LanguageMappingStore store = new LanguageMappingStore();
|
||||||
store.storeMappings(mappings);
|
store.storeMappings(project, mappings);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify listeners that the language mappings have changed.
|
// Notify listeners that the language mappings have changed.
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 IBM Corporation 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:
|
||||||
|
* IBM Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.core.language;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.ILanguage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A language mapping.
|
||||||
|
*/
|
||||||
|
public class LanguageMapping {
|
||||||
|
public ILanguage language;
|
||||||
|
public int inheritedFrom;
|
||||||
|
|
||||||
|
public LanguageMapping(ILanguage language, int inheritedFrom) {
|
||||||
|
this.language = language;
|
||||||
|
this.inheritedFrom = inheritedFrom;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,108 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 IBM Corporation 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:
|
||||||
|
* IBM Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.core.language;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
||||||
|
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
|
||||||
|
import org.eclipse.cdt.core.model.LanguageManager;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
import org.eclipse.core.runtime.content.IContentType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves the effective language for various resources such as
|
||||||
|
* files and projects.
|
||||||
|
*/
|
||||||
|
public class LanguageMappingResolver {
|
||||||
|
public static final int DEFAULT_MAPPING = 0;
|
||||||
|
public static final int WORKSPACE_MAPPING = 1;
|
||||||
|
public static final int PROJECT_MAPPING = 2;
|
||||||
|
public static final int FILE_MAPPING = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the effective language for the file specified by the given path.
|
||||||
|
* If <code>fetchAll</code> is <code>true</code> all inherited language
|
||||||
|
* mappings will be returned in order of precedence. Otherwise, only the
|
||||||
|
* effective language will be returned.
|
||||||
|
*
|
||||||
|
* This method will always return at least one mapping.
|
||||||
|
*
|
||||||
|
* @param project the project that contains the given file
|
||||||
|
* @param filePath the path to the file
|
||||||
|
* @param contentTypeId the content type of the file (optional)
|
||||||
|
* @param fetchAll if <code>true</code>, returns all inherited language mappings.
|
||||||
|
* Otherwise, returns only the effective language.
|
||||||
|
* @return the effective language for the file specified by the given path.
|
||||||
|
* @throws CoreException
|
||||||
|
*/
|
||||||
|
public static LanguageMapping[] computeLanguage(IProject project, String filePath, String contentTypeId, boolean fetchAll) throws CoreException {
|
||||||
|
LanguageManager manager = LanguageManager.getInstance();
|
||||||
|
List inheritedLanguages = new LinkedList();
|
||||||
|
|
||||||
|
if (project != null) {
|
||||||
|
ProjectLanguageConfiguration mappings = manager.getLanguageConfiguration(project);
|
||||||
|
|
||||||
|
if (mappings != null) {
|
||||||
|
// File-level mappings
|
||||||
|
if (filePath != null) {
|
||||||
|
String id = mappings.getLanguageForFile(filePath);
|
||||||
|
if (id != null) {
|
||||||
|
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(id), FILE_MAPPING));
|
||||||
|
if (!fetchAll) {
|
||||||
|
return createLanguageMappingArray(inheritedLanguages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Project-level mappings
|
||||||
|
String id = mappings.getLanguageForContentType(contentTypeId);
|
||||||
|
if (id != null) {
|
||||||
|
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(id), PROJECT_MAPPING));
|
||||||
|
if (!fetchAll) {
|
||||||
|
return createLanguageMappingArray(inheritedLanguages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Workspace mappings
|
||||||
|
WorkspaceLanguageConfiguration workspaceMappings = manager.getWorkspaceLanguageConfiguration();
|
||||||
|
String id = workspaceMappings.getLanguageForContentType(contentTypeId);
|
||||||
|
if (id != null) {
|
||||||
|
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(id), WORKSPACE_MAPPING));
|
||||||
|
if (!fetchAll) {
|
||||||
|
return createLanguageMappingArray(inheritedLanguages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Platform mappings
|
||||||
|
IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeId);
|
||||||
|
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(contentType), DEFAULT_MAPPING));
|
||||||
|
return createLanguageMappingArray(inheritedLanguages);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LanguageMapping[] createLanguageMappingArray(List inheritedLanguages) {
|
||||||
|
LanguageMapping[] results = new LanguageMapping[inheritedLanguages.size()];
|
||||||
|
Iterator mappings = inheritedLanguages.iterator();
|
||||||
|
int i = 0;
|
||||||
|
while (mappings.hasNext()) {
|
||||||
|
LanguageMapping mapping = (LanguageMapping) mappings.next();
|
||||||
|
results[i] = mapping;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,77 +10,176 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.language;
|
package org.eclipse.cdt.internal.core.language;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.io.StringWriter;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.transform.Transformer;
|
||||||
|
import javax.xml.transform.TransformerConfigurationException;
|
||||||
|
import javax.xml.transform.TransformerException;
|
||||||
|
import javax.xml.transform.TransformerFactory;
|
||||||
|
import javax.xml.transform.TransformerFactoryConfigurationError;
|
||||||
|
import javax.xml.transform.dom.DOMSource;
|
||||||
|
import javax.xml.transform.stream.StreamResult;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.CCorePreferenceConstants;
|
||||||
import org.eclipse.cdt.core.ICDescriptor;
|
import org.eclipse.cdt.core.ICDescriptor;
|
||||||
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
||||||
|
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
|
||||||
|
import org.eclipse.cdt.internal.core.Util;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.Preferences;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.w3c.dom.Element;
|
import org.w3c.dom.Element;
|
||||||
import org.w3c.dom.Node;
|
import org.w3c.dom.Node;
|
||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serializes and deserializes language mappings to and from persistent storage.
|
||||||
|
*/
|
||||||
public class LanguageMappingStore {
|
public class LanguageMappingStore {
|
||||||
private static final String LANGUAGE_MAPPING_ID = "org.eclipse.cdt.core.language.mapping"; //$NON-NLS-1$
|
private static final String LANGUAGE_MAPPING_ID = "org.eclipse.cdt.core.language.mapping"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final String PROJECT_MAPPINGS = "project-mappings"; //$NON-NLS-1$
|
private static final String PROJECT_MAPPINGS = "project-mappings"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final String PROJECT_MAPPING = "project-mapping"; //$NON-NLS-1$
|
private static final String WORKSPACE_MAPPINGS = "workspace-mappings"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String CONTENT_TYPE_MAPPING = "content-type-mapping"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String FILE_MAPPING = "file-mapping"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String ATTRIBUTE_PATH = "path"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final String ATTRIBUTE_CONTENT_TYPE = "content-type"; //$NON-NLS-1$
|
private static final String ATTRIBUTE_CONTENT_TYPE = "content-type"; //$NON-NLS-1$
|
||||||
|
|
||||||
private static final String ATTRIBUTE_LANGUAGE = "language"; //$NON-NLS-1$
|
private static final String ATTRIBUTE_LANGUAGE = "language"; //$NON-NLS-1$
|
||||||
|
|
||||||
private IProject fProject;
|
public LanguageMappingStore() {
|
||||||
|
|
||||||
public LanguageMappingStore(IProject project) {
|
|
||||||
fProject = project;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProjectLanguageConfiguration decodeMappings() throws CoreException {
|
public ProjectLanguageConfiguration decodeMappings(IProject project) throws CoreException {
|
||||||
ProjectLanguageConfiguration config = new ProjectLanguageConfiguration();
|
ProjectLanguageConfiguration config = new ProjectLanguageConfiguration();
|
||||||
ICDescriptor descriptor = getProjectDescription();
|
ICDescriptor descriptor = getProjectDescription(project);
|
||||||
Element rootElement = descriptor.getProjectData(LANGUAGE_MAPPING_ID);
|
Element rootElement = descriptor.getProjectData(LANGUAGE_MAPPING_ID);
|
||||||
if (rootElement == null) {
|
if (rootElement == null) {
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
config.setContentTypeMappings(decodeProjectMappings(rootElement));
|
|
||||||
|
NodeList mappingElements = rootElement.getElementsByTagName(PROJECT_MAPPINGS);
|
||||||
|
if (mappingElements.getLength() > 0) {
|
||||||
|
Element element = (Element) mappingElements.item(0);
|
||||||
|
config.setContentTypeMappings(decodeContentTypeMappings(element));
|
||||||
|
config.setFileMappings(decodeFileMappings(element));
|
||||||
|
}
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ICDescriptor getProjectDescription() throws CoreException {
|
protected ICDescriptor getProjectDescription(IProject project) throws CoreException {
|
||||||
return CCorePlugin.getDefault().getCProjectDescription(fProject, true);
|
return CCorePlugin.getDefault().getCProjectDescription(project, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map decodeProjectMappings(Element rootElement) throws CoreException {
|
private Map decodeContentTypeMappings(Element rootElement) throws CoreException {
|
||||||
|
return decodeMappings(rootElement, CONTENT_TYPE_MAPPING, ATTRIBUTE_CONTENT_TYPE, ATTRIBUTE_LANGUAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map decodeFileMappings(Element rootElement) throws CoreException {
|
||||||
|
return decodeMappings(rootElement, FILE_MAPPING, ATTRIBUTE_PATH, ATTRIBUTE_LANGUAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map decodeMappings(Element rootElement, String category, String keyName, String valueName) {
|
||||||
Map decodedMappings = new TreeMap();
|
Map decodedMappings = new TreeMap();
|
||||||
NodeList elements = rootElement.getElementsByTagName(PROJECT_MAPPINGS);
|
NodeList mappingElements = rootElement.getElementsByTagName(category);
|
||||||
for (int i = 0; i < elements.getLength(); i++) {
|
for (int j = 0; j < mappingElements.getLength(); j++) {
|
||||||
Element projectMappings = (Element) elements.item(i);
|
Element mapping = (Element) mappingElements.item(j);
|
||||||
NodeList mappingElements = projectMappings.getElementsByTagName(PROJECT_MAPPING);
|
String key = mapping.getAttribute(keyName);
|
||||||
for (int j = 0; j < mappingElements.getLength(); j++) {
|
String value = mapping.getAttribute(valueName);
|
||||||
Element mapping = (Element) mappingElements.item(j);
|
decodedMappings.put(key, value);
|
||||||
String contentType = mapping.getAttribute(ATTRIBUTE_CONTENT_TYPE);
|
|
||||||
String language = mapping.getAttribute(ATTRIBUTE_LANGUAGE);
|
|
||||||
decodedMappings.put(contentType, language);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return decodedMappings;
|
return decodedMappings;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void storeMappings(ProjectLanguageConfiguration config) throws CoreException {
|
public void storeMappings(IProject project, ProjectLanguageConfiguration config) throws CoreException {
|
||||||
ICDescriptor descriptor = getProjectDescription();
|
ICDescriptor descriptor = getProjectDescription(project);
|
||||||
Element rootElement = descriptor.getProjectData(LANGUAGE_MAPPING_ID);
|
Element rootElement = descriptor.getProjectData(LANGUAGE_MAPPING_ID);
|
||||||
clearChildren(rootElement);
|
clearChildren(rootElement);
|
||||||
addProjectMappings(config.getContentTypeMappings(), rootElement);
|
|
||||||
|
Document document = rootElement.getOwnerDocument();
|
||||||
|
Element projectMappings = document.createElement(PROJECT_MAPPINGS);
|
||||||
|
rootElement.appendChild(projectMappings);
|
||||||
|
|
||||||
|
addContentTypeMappings(config.getContentTypeMappings(), projectMappings);
|
||||||
|
addFileMappings(config.getFileMappings(), projectMappings);
|
||||||
descriptor.saveProjectData();
|
descriptor.saveProjectData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void storeMappings(WorkspaceLanguageConfiguration config) throws CoreException {
|
||||||
|
try {
|
||||||
|
// Encode mappings as XML and serialize as a String.
|
||||||
|
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||||
|
Element rootElement = doc.createElement(WORKSPACE_MAPPINGS);
|
||||||
|
doc.appendChild(rootElement);
|
||||||
|
addContentTypeMappings(config.getWorkspaceMappings(), rootElement);
|
||||||
|
Transformer serializer = createSerializer();
|
||||||
|
DOMSource source = new DOMSource(doc);
|
||||||
|
StringWriter buffer = new StringWriter();
|
||||||
|
StreamResult result = new StreamResult(buffer);
|
||||||
|
serializer.transform(source, result);
|
||||||
|
String encodedMappings = buffer.getBuffer().toString();
|
||||||
|
|
||||||
|
Preferences node = CCorePlugin.getDefault().getPluginPreferences();;
|
||||||
|
node.setValue(CCorePreferenceConstants.WORKSPACE_LANGUAGE_MAPPINGS, encodedMappings);
|
||||||
|
CCorePlugin.getDefault().savePluginPreferences();
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
throw new CoreException(Util.createStatus(e));
|
||||||
|
} catch (TransformerException e) {
|
||||||
|
throw new CoreException(Util.createStatus(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public WorkspaceLanguageConfiguration decodeWorkspaceMappings() throws CoreException {
|
||||||
|
Preferences node = CCorePlugin.getDefault().getPluginPreferences();;
|
||||||
|
String encodedMappings = node.getString(CCorePreferenceConstants.WORKSPACE_LANGUAGE_MAPPINGS);
|
||||||
|
WorkspaceLanguageConfiguration config = new WorkspaceLanguageConfiguration();
|
||||||
|
|
||||||
|
if (encodedMappings == null || encodedMappings.length() == 0) {
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The mappings are encoded as XML in a String so we need to parse it.
|
||||||
|
InputSource input = new InputSource(new StringReader(encodedMappings));
|
||||||
|
try {
|
||||||
|
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input);
|
||||||
|
config.setWorkspaceMappings(decodeContentTypeMappings(document.getDocumentElement()));
|
||||||
|
return config;
|
||||||
|
} catch (SAXException e) {
|
||||||
|
throw new CoreException(Util.createStatus(e));
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new CoreException(Util.createStatus(e));
|
||||||
|
} catch (ParserConfigurationException e) {
|
||||||
|
throw new CoreException(Util.createStatus(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Transformer createSerializer() throws CoreException {
|
||||||
|
try {
|
||||||
|
return TransformerFactory.newInstance().newTransformer();
|
||||||
|
} catch (TransformerConfigurationException e) {
|
||||||
|
throw new CoreException(Util.createStatus(e));
|
||||||
|
} catch (TransformerFactoryConfigurationError e) {
|
||||||
|
throw new CoreException(Util.createStatus(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void clearChildren(Element element) {
|
private void clearChildren(Element element) {
|
||||||
Node child = element.getFirstChild();
|
Node child = element.getFirstChild();
|
||||||
while (child != null) {
|
while (child != null) {
|
||||||
|
@ -89,17 +188,23 @@ public class LanguageMappingStore {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addProjectMappings(Map mappings, Element rootElement) {
|
private void addMappings(Map mappings, Element rootElement, String category, String keyName, String valueName) {
|
||||||
Document document = rootElement.getOwnerDocument();
|
Document document = rootElement.getOwnerDocument();
|
||||||
Element projectMappings = document.createElement(PROJECT_MAPPINGS);
|
|
||||||
Iterator entries = mappings.entrySet().iterator();
|
Iterator entries = mappings.entrySet().iterator();
|
||||||
while (entries.hasNext()) {
|
while (entries.hasNext()) {
|
||||||
Entry entry = (Entry) entries.next();
|
Entry entry = (Entry) entries.next();
|
||||||
Element mapping = document.createElement(PROJECT_MAPPING);
|
Element mapping = document.createElement(category);
|
||||||
mapping.setAttribute(ATTRIBUTE_CONTENT_TYPE, (String) entry.getKey());
|
mapping.setAttribute(keyName, (String) entry.getKey());
|
||||||
mapping.setAttribute(ATTRIBUTE_LANGUAGE, (String) entry.getValue());
|
mapping.setAttribute(valueName, (String) entry.getValue());
|
||||||
projectMappings.appendChild(mapping);
|
rootElement.appendChild(mapping);
|
||||||
}
|
}
|
||||||
rootElement.appendChild(projectMappings);
|
}
|
||||||
|
|
||||||
|
private void addContentTypeMappings(Map mappings, Element rootElement) {
|
||||||
|
addMappings(mappings, rootElement, CONTENT_TYPE_MAPPING, ATTRIBUTE_CONTENT_TYPE, ATTRIBUTE_LANGUAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addFileMappings(Map mappings, Element rootElement) {
|
||||||
|
addMappings(mappings, rootElement, FILE_MAPPING, ATTRIBUTE_PATH, ATTRIBUTE_LANGUAGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 IBM Corporation 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:
|
||||||
|
* IBM Corporation - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.core.pdom;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.model.ILanguageMappingChangeListener;
|
||||||
|
import org.eclipse.cdt.core.model.ILanguageMappingChangeEvent;
|
||||||
|
import org.eclipse.cdt.core.model.LanguageManager;
|
||||||
|
import org.eclipse.cdt.internal.core.model.CElementDelta;
|
||||||
|
import org.eclipse.cdt.internal.core.model.CModelManager;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author crecoskie
|
||||||
|
*
|
||||||
|
* This class handles changes in language mappings for the PDOM by reindexing the appropriate projects.
|
||||||
|
* This class is a a work in progress and will be changed soon to be smarter about the resources it reindexes.
|
||||||
|
*/
|
||||||
|
public class LanguageMappingChangeListener implements
|
||||||
|
ILanguageMappingChangeListener {
|
||||||
|
|
||||||
|
private PDOMManager fManager;
|
||||||
|
|
||||||
|
public LanguageMappingChangeListener(PDOMManager manager) {
|
||||||
|
fManager = manager;
|
||||||
|
LanguageManager.getInstance().registerLanguageChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.core.model.ILanguageMappingChangeListener#handleLanguageMappingChangeEvent(org.eclipse.cdt.core.model.ILanguageMappingsChangeEvent)
|
||||||
|
*/
|
||||||
|
public void handleLanguageMappingChangeEvent(ILanguageMappingChangeEvent event) {
|
||||||
|
IProject project = event.getProject();
|
||||||
|
|
||||||
|
CModelManager manager = CModelManager.getDefault();
|
||||||
|
if(project != null) {
|
||||||
|
ICProject cProject = manager.getCModel().findCProject(project);
|
||||||
|
|
||||||
|
if(cProject != null)
|
||||||
|
try {
|
||||||
|
fManager.reindex(cProject);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.getType() == ILanguageMappingChangeEvent.TYPE_WORKSPACE) {
|
||||||
|
// For now reindex all projects.
|
||||||
|
// TODO: This should be smarter about figuring out which projects
|
||||||
|
// are potentially unaffected due to project settings
|
||||||
|
try {
|
||||||
|
ICProject[] cProjects = manager.getCModel().getCProjects();
|
||||||
|
for(int k = 0; k < cProjects.length; k++) {
|
||||||
|
try {
|
||||||
|
fManager.reindex(cProjects[k]);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (CModelException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
} else if (event.getType() == ILanguageMappingChangeEvent.TYPE_PROJECT) {
|
||||||
|
// For now, reindex the entire project since we don't know which
|
||||||
|
// files are affected.
|
||||||
|
try {
|
||||||
|
ICProject cProject = manager.getCModel().getCProject(event.getProject());
|
||||||
|
fManager.reindex(cProject);
|
||||||
|
} catch (CModelException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
} else if (event.getType() == ILanguageMappingChangeEvent.TYPE_FILE) {
|
||||||
|
// Just reindex the affected file.
|
||||||
|
IFile file = event.getFile();
|
||||||
|
ICProject cProject = manager.getCModel().getCProject(file);
|
||||||
|
ICElement element = manager.create(file, cProject);
|
||||||
|
CElementDelta delta = new CElementDelta(element);
|
||||||
|
delta.changed(element, ICElementDelta.F_CONTENT);
|
||||||
|
try {
|
||||||
|
fManager.changeProject(cProject, delta);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,6 +40,7 @@ import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.ICElementDelta;
|
import org.eclipse.cdt.core.model.ICElementDelta;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.model.IElementChangedListener;
|
import org.eclipse.cdt.core.model.IElementChangedListener;
|
||||||
|
import org.eclipse.cdt.core.model.ILanguageMappingChangeListener;
|
||||||
import org.eclipse.cdt.internal.core.CCoreInternals;
|
import org.eclipse.cdt.internal.core.CCoreInternals;
|
||||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
||||||
|
@ -143,6 +144,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
|
||||||
private IElementChangedListener fCModelListener= new CModelListener(this);
|
private IElementChangedListener fCModelListener= new CModelListener(this);
|
||||||
private IndexFactory fIndexFactory= new IndexFactory(this);
|
private IndexFactory fIndexFactory= new IndexFactory(this);
|
||||||
private IndexProviderManager manager = new IndexProviderManager();
|
private IndexProviderManager manager = new IndexProviderManager();
|
||||||
|
|
||||||
|
private ILanguageMappingChangeListener fLanguageChangeListener = new LanguageMappingChangeListener(this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serializes creation of new indexer, when acquiring the lock you are
|
* Serializes creation of new indexer, when acquiring the lock you are
|
||||||
|
|
|
@ -65,4 +65,14 @@ public class CCorePreferenceConstants {
|
||||||
* Default absolute maximum size of the index-db in megabytes.
|
* Default absolute maximum size of the index-db in megabytes.
|
||||||
*/
|
*/
|
||||||
public static final String DEFAULT_MAX_INDEX_DB_CACHE_SIZE_MB = "64"; //$NON-NLS-1$
|
public static final String DEFAULT_MAX_INDEX_DB_CACHE_SIZE_MB = "64"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Workspace-wide language mappings.
|
||||||
|
*/
|
||||||
|
public static final String WORKSPACE_LANGUAGE_MAPPINGS = CCorePlugin.PLUGIN_ID + ".workspaceLanguageMappings"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default workspace-wide language mappings.
|
||||||
|
*/
|
||||||
|
public static final String DEFAULT_WORKSPACE_LANGUAGE_MAPPINGS = ""; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,7 @@ public class CCorePreferenceInitializer extends AbstractPreferenceInitializer {
|
||||||
defaultOptionsMap.put(CCorePreferenceConstants.INDEX_DB_CACHE_SIZE_PCT, CCorePreferenceConstants.DEFAULT_INDEX_DB_CACHE_SIZE_PCT);
|
defaultOptionsMap.put(CCorePreferenceConstants.INDEX_DB_CACHE_SIZE_PCT, CCorePreferenceConstants.DEFAULT_INDEX_DB_CACHE_SIZE_PCT);
|
||||||
defaultOptionsMap.put(CCorePreferenceConstants.MAX_INDEX_DB_CACHE_SIZE_MB, CCorePreferenceConstants.DEFAULT_MAX_INDEX_DB_CACHE_SIZE_MB);
|
defaultOptionsMap.put(CCorePreferenceConstants.MAX_INDEX_DB_CACHE_SIZE_MB, CCorePreferenceConstants.DEFAULT_MAX_INDEX_DB_CACHE_SIZE_MB);
|
||||||
|
|
||||||
|
defaultOptionsMap.put(CCorePreferenceConstants.WORKSPACE_LANGUAGE_MAPPINGS, CCorePreferenceConstants.DEFAULT_WORKSPACE_LANGUAGE_MAPPINGS);
|
||||||
// Store default values to default preferences
|
// Store default values to default preferences
|
||||||
IEclipsePreferences defaultPreferences = ((IScopeContext) new DefaultScope()).getNode(CCorePlugin.PLUGIN_ID);
|
IEclipsePreferences defaultPreferences = ((IScopeContext) new DefaultScope()).getNode(CCorePlugin.PLUGIN_ID);
|
||||||
for (Iterator iter = defaultOptionsMap.entrySet().iterator(); iter.hasNext();) {
|
for (Iterator iter = defaultOptionsMap.entrySet().iterator(); iter.hasNext();) {
|
||||||
|
|
|
@ -685,6 +685,12 @@
|
||||||
class="org.eclipse.cdt.internal.ui.preferences.IndexerPreferencePage"
|
class="org.eclipse.cdt.internal.ui.preferences.IndexerPreferencePage"
|
||||||
id="org.eclipse.cdt.ui.preferences.IndexerPreferencePage"
|
id="org.eclipse.cdt.ui.preferences.IndexerPreferencePage"
|
||||||
name="%indexerPrefName"/>
|
name="%indexerPrefName"/>
|
||||||
|
<page
|
||||||
|
category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage"
|
||||||
|
class="org.eclipse.cdt.internal.ui.language.WorkspaceLanguageMappingPreferencePage"
|
||||||
|
id="org.eclipse.cdt.ui.preferences.LanguageMappings"
|
||||||
|
name="%CDTLanguagesProperty.name">
|
||||||
|
</page>
|
||||||
<!--page
|
<!--page
|
||||||
name="%WorkInProgress.name"
|
name="%WorkInProgress.name"
|
||||||
category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage"
|
category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage"
|
||||||
|
@ -1466,6 +1472,16 @@
|
||||||
</adapt>
|
</adapt>
|
||||||
</enabledWhen>
|
</enabledWhen>
|
||||||
</page>
|
</page>
|
||||||
|
<page
|
||||||
|
class="org.eclipse.cdt.internal.ui.language.FileLanguageMappingPropertyPage"
|
||||||
|
id="org.eclipse.cdt.ui.fileLanguageMappings"
|
||||||
|
name="%CDTLanguagesProperty.name">
|
||||||
|
<enabledWhen>
|
||||||
|
<adapt
|
||||||
|
type="org.eclipse.cdt.core.model.ITranslationUnit">
|
||||||
|
</adapt>
|
||||||
|
</enabledWhen>
|
||||||
|
</page>
|
||||||
</extension>
|
</extension>
|
||||||
<extension
|
<extension
|
||||||
point="org.eclipse.cdt.ui.PathContainerPage">
|
point="org.eclipse.cdt.ui.PathContainerPage">
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.eclipse.swt.widgets.Event;
|
||||||
import org.eclipse.swt.widgets.Label;
|
import org.eclipse.swt.widgets.Label;
|
||||||
import org.eclipse.swt.widgets.Listener;
|
import org.eclipse.swt.widgets.Listener;
|
||||||
import org.eclipse.swt.widgets.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.ILanguage;
|
import org.eclipse.cdt.core.model.ILanguage;
|
||||||
import org.eclipse.cdt.core.model.LanguageManager;
|
import org.eclipse.cdt.core.model.LanguageManager;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,199 @@
|
||||||
|
package org.eclipse.cdt.internal.ui.language;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.content.IContentType;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Combo;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Link;
|
||||||
|
import org.eclipse.ui.dialogs.PropertyPage;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
||||||
|
import org.eclipse.cdt.core.model.ILanguage;
|
||||||
|
import org.eclipse.cdt.core.model.LanguageManager;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.core.CContentTypes;
|
||||||
|
import org.eclipse.cdt.internal.core.Util;
|
||||||
|
import org.eclipse.cdt.internal.core.language.LanguageMapping;
|
||||||
|
import org.eclipse.cdt.internal.core.language.LanguageMappingResolver;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.preferences.PreferencesMessages;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.Messages;
|
||||||
|
|
||||||
|
public class FileLanguageMappingPropertyPage extends PropertyPage {
|
||||||
|
|
||||||
|
private Map fLanguageNamesToIDsMap;
|
||||||
|
private Combo fLanguage;
|
||||||
|
private IContentType fContentType;
|
||||||
|
private Composite fContents;
|
||||||
|
|
||||||
|
public FileLanguageMappingPropertyPage() {
|
||||||
|
super();
|
||||||
|
fLanguageNamesToIDsMap = new TreeMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Control createContents(Composite parent) {
|
||||||
|
IFile file = getFile();
|
||||||
|
IProject project = file.getProject();
|
||||||
|
fContentType = CContentTypes.getContentType(project, file.getLocation().toString());
|
||||||
|
|
||||||
|
fContents = new Composite(parent, SWT.NONE);
|
||||||
|
fContents.setLayout(new GridLayout(2, false));
|
||||||
|
|
||||||
|
Label contentTypeLabel = new Label(fContents, SWT.NONE);
|
||||||
|
contentTypeLabel.setText(PreferencesMessages.FileLanguagesPropertyPage_contentTypeLabel);
|
||||||
|
contentTypeLabel.setLayoutData(new GridData(SWT.TRAIL, SWT.CENTER, false, false));
|
||||||
|
|
||||||
|
Label contentTypeDescriptionLabel = new Label(fContents, SWT.NONE);
|
||||||
|
contentTypeDescriptionLabel.setText(fContentType.getName());
|
||||||
|
contentTypeDescriptionLabel.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
|
||||||
|
|
||||||
|
Label languageLabel = new Label(fContents, SWT.NONE);
|
||||||
|
languageLabel.setText(PreferencesMessages.FileLanguagesPropertyPage_languageLabel);
|
||||||
|
languageLabel.setLayoutData(new GridData(SWT.TRAIL, SWT.CENTER, false, false));
|
||||||
|
|
||||||
|
fLanguage = new Combo(fContents, SWT.DROP_DOWN | SWT.READ_ONLY);
|
||||||
|
fLanguage.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
|
||||||
|
refreshMappings();
|
||||||
|
|
||||||
|
Link link = new Link(fContents, SWT.NONE);
|
||||||
|
link.setText(PreferencesMessages.FileLanguagesPropertyPage_description);
|
||||||
|
link.addListener(SWT.Selection, new LanguageMappingLinkListener(parent.getShell(), project) {
|
||||||
|
protected void refresh() {
|
||||||
|
refreshMappings();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
link.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false, 2, 1));
|
||||||
|
|
||||||
|
return fContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshMappings() {
|
||||||
|
try {
|
||||||
|
fLanguage.setItems(getLanguages());
|
||||||
|
findSelection();
|
||||||
|
fContents.layout();
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void findSelection() throws CoreException {
|
||||||
|
IFile file = getFile();
|
||||||
|
LanguageManager manager = LanguageManager.getInstance();
|
||||||
|
ProjectLanguageConfiguration config = manager.getLanguageConfiguration(file.getProject());
|
||||||
|
String languageId = config.getLanguageForFile(file);
|
||||||
|
|
||||||
|
if (languageId == null) {
|
||||||
|
// No mapping was defined so we'll choose the default.
|
||||||
|
fLanguage.select(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ILanguage language = manager.getLanguage(languageId);
|
||||||
|
String name = language.getName();
|
||||||
|
|
||||||
|
for (int i = 1; i < fLanguage.getItemCount(); i++) {
|
||||||
|
if (name.equals(fLanguage.getItem(i))) {
|
||||||
|
fLanguage.select(i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Couldn't find the mapping so we'll choose the default.
|
||||||
|
fLanguage.select(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean performOk() {
|
||||||
|
String languageId;
|
||||||
|
String selectedLanguageName = fLanguage.getText();
|
||||||
|
languageId = (String) fLanguageNamesToIDsMap.get(selectedLanguageName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
IFile file = getFile();
|
||||||
|
IProject project = file.getProject();
|
||||||
|
LanguageManager manager = LanguageManager.getInstance();
|
||||||
|
ProjectLanguageConfiguration config = manager.getLanguageConfiguration(project);
|
||||||
|
String oldMapping = config.getLanguageForFile(file);
|
||||||
|
|
||||||
|
if (oldMapping == languageId) {
|
||||||
|
// No changes. We're all done.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (languageId == null) {
|
||||||
|
config.removeFileMapping(file);
|
||||||
|
} else {
|
||||||
|
config.addFileMapping(file, languageId);
|
||||||
|
}
|
||||||
|
manager.storeLanguageMappingConfiguration(file);
|
||||||
|
return true;
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IFile getFile() {
|
||||||
|
return (IFile) getElement().getAdapter(IFile.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void performDefaults() {
|
||||||
|
super.performDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] getLanguages() throws CoreException {
|
||||||
|
ILanguage[] languages = LanguageManager.getInstance().getRegisteredLanguages();
|
||||||
|
String[] descriptions = new String[languages.length];
|
||||||
|
|
||||||
|
IFile file = getFile();
|
||||||
|
IProject project = file.getProject();
|
||||||
|
LanguageMapping mappings[] = LanguageMappingResolver.computeLanguage(project, file.getProjectRelativePath().toPortableString(), fContentType.getId(), true);
|
||||||
|
LanguageMapping inheritedMapping = mappings[0];
|
||||||
|
|
||||||
|
// Skip over the file mapping because we want to know what mapping the file
|
||||||
|
// mapping overrides.
|
||||||
|
if (inheritedMapping.inheritedFrom == LanguageMappingResolver.FILE_MAPPING ) {
|
||||||
|
inheritedMapping = mappings[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
ILanguage inheritedLanguage = inheritedMapping.language;
|
||||||
|
String inheritedFrom;
|
||||||
|
switch (inheritedMapping.inheritedFrom) {
|
||||||
|
case LanguageMappingResolver.DEFAULT_MAPPING:
|
||||||
|
inheritedFrom = PreferencesMessages.FileLanguagesPropertyPage_inheritedFromSystem;
|
||||||
|
break;
|
||||||
|
case LanguageMappingResolver.PROJECT_MAPPING:
|
||||||
|
inheritedFrom = PreferencesMessages.FileLanguagesPropertyPage_inheritedFromProject;
|
||||||
|
break;
|
||||||
|
case LanguageMappingResolver.WORKSPACE_MAPPING:
|
||||||
|
inheritedFrom = PreferencesMessages.FileLanguagesPropertyPage_inheritedFromWorkspace;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new CoreException(Util.createStatus(new IllegalArgumentException()));
|
||||||
|
}
|
||||||
|
int index = 0;
|
||||||
|
descriptions[index] = Messages.format(inheritedFrom, inheritedLanguage.getName());
|
||||||
|
|
||||||
|
index++;
|
||||||
|
for (int i = 0; i < languages.length; i++) {
|
||||||
|
String id = languages[i].getId();
|
||||||
|
if (!languages[i].equals(inheritedLanguage)) {
|
||||||
|
descriptions[index] = languages[i].getName();
|
||||||
|
fLanguageNamesToIDsMap.put(descriptions[index], id);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return descriptions;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 IBM Corporation 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:
|
||||||
|
* IBM Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.language;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
|
import org.eclipse.swt.widgets.Event;
|
||||||
|
import org.eclipse.swt.widgets.Listener;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
|
import org.eclipse.ui.dialogs.PreferencesUtil;
|
||||||
|
|
||||||
|
public class LanguageMappingLinkListener implements Listener {
|
||||||
|
|
||||||
|
private static final String WORKSPACE_PREFERENCE_PAGE = "org.eclipse.cdt.ui.preferences.LanguageMappings"; //$NON-NLS-1$
|
||||||
|
private static final String PROJECT_PROPERTY_PAGE = "org.eclipse.cdt.ui.projectLanguageMappings"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private static final String WORKSPACE_LINK = "workspace"; //$NON-NLS-1$
|
||||||
|
private static final String PROJECT_LINK = "project"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
private Shell fShell;
|
||||||
|
private IAdaptable fElement;
|
||||||
|
|
||||||
|
public LanguageMappingLinkListener(Shell shell, IAdaptable element) {
|
||||||
|
fShell = shell;
|
||||||
|
fElement = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleEvent(Event event) {
|
||||||
|
if (WORKSPACE_LINK.equals(event.text)) {
|
||||||
|
PreferencesUtil.createPreferenceDialogOn(fShell, WORKSPACE_PREFERENCE_PAGE, null, null).open();
|
||||||
|
} else if (PROJECT_LINK.equals(event.text)) {
|
||||||
|
PreferencesUtil.createPropertyDialogOn(fShell, fElement, PROJECT_PROPERTY_PAGE, null, null).open();
|
||||||
|
}
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void refresh() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,243 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 IBM Corporation 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:
|
||||||
|
* IBM Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.language;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
import org.eclipse.core.runtime.content.IContentType;
|
||||||
|
import org.eclipse.core.runtime.content.IContentTypeManager;
|
||||||
|
import org.eclipse.jface.layout.TableColumnLayout;
|
||||||
|
import org.eclipse.jface.resource.JFaceResources;
|
||||||
|
import org.eclipse.jface.viewers.ColumnWeightData;
|
||||||
|
import org.eclipse.jface.window.Window;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.Font;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Event;
|
||||||
|
import org.eclipse.swt.widgets.Link;
|
||||||
|
import org.eclipse.swt.widgets.Listener;
|
||||||
|
import org.eclipse.swt.widgets.Table;
|
||||||
|
import org.eclipse.swt.widgets.TableColumn;
|
||||||
|
import org.eclipse.swt.widgets.TableItem;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.model.LanguageManager;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.preferences.PreferencesMessages;
|
||||||
|
import org.eclipse.cdt.internal.ui.util.Messages;
|
||||||
|
|
||||||
|
public class LanguageMappingWidget {
|
||||||
|
|
||||||
|
private static final int MINIMUM_COLUMN_WIDTH = 150;
|
||||||
|
private Table fTable;
|
||||||
|
private HashMap fContentTypeNamesToIDsMap;
|
||||||
|
private Set fAffectedContentTypes;
|
||||||
|
private Composite fContents;
|
||||||
|
private Map fContentTypeMappings;
|
||||||
|
private boolean fIsReadOnly;
|
||||||
|
private Set fOverriddenContentTypes;
|
||||||
|
private Font fOverriddenFont;
|
||||||
|
private LanguageMappingWidget fChild;
|
||||||
|
private IAdaptable fElement;
|
||||||
|
|
||||||
|
public LanguageMappingWidget() {
|
||||||
|
fOverriddenFont = JFaceResources.getFontRegistry().getItalic(JFaceResources.DIALOG_FONT);
|
||||||
|
fOverriddenContentTypes = Collections.EMPTY_SET;
|
||||||
|
|
||||||
|
// keep a mapping of all registered content types and their names
|
||||||
|
fContentTypeNamesToIDsMap = new HashMap();
|
||||||
|
String[] contentTypesIDs = LanguageManager.getInstance().getRegisteredContentTypeIds();
|
||||||
|
|
||||||
|
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
|
||||||
|
|
||||||
|
for (int i = 0; i < contentTypesIDs.length; i++) {
|
||||||
|
|
||||||
|
String name = contentTypeManager.getContentType(contentTypesIDs[i]).getName();
|
||||||
|
|
||||||
|
// keep track of what ID this name corresponds to so that when we
|
||||||
|
// setup the mapping
|
||||||
|
// later based upon user selection, we'll know what ID to use
|
||||||
|
fContentTypeNamesToIDsMap.put(name, contentTypesIDs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fContentTypeMappings = new TreeMap();
|
||||||
|
fAffectedContentTypes = new HashSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Composite createContents(Composite parent, String description) {
|
||||||
|
fContents = new Composite(parent, SWT.NONE);
|
||||||
|
fContents.setLayout(new GridLayout(2, false));
|
||||||
|
|
||||||
|
if (description != null) {
|
||||||
|
createHeader(parent, description);
|
||||||
|
}
|
||||||
|
|
||||||
|
Composite tableParent = new Composite(fContents, SWT.NONE);
|
||||||
|
tableParent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
|
||||||
|
|
||||||
|
fTable = new Table(tableParent, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION);
|
||||||
|
fTable.setHeaderVisible(true);
|
||||||
|
fTable.setLinesVisible(true);
|
||||||
|
|
||||||
|
TableColumn contentTypeColumn = new TableColumn(fTable, SWT.LEAD);
|
||||||
|
contentTypeColumn.setText(PreferencesMessages.ProjectLanguagesPropertyPage_contentTypeColumn);
|
||||||
|
|
||||||
|
TableColumn languageColumn = new TableColumn(fTable, SWT.LEAD);
|
||||||
|
languageColumn.setText(PreferencesMessages.ProjectLanguagesPropertyPage_languageColumn);
|
||||||
|
|
||||||
|
TableColumnLayout layout = new TableColumnLayout();
|
||||||
|
layout.setColumnData(contentTypeColumn, new ColumnWeightData(1, MINIMUM_COLUMN_WIDTH, true));
|
||||||
|
layout.setColumnData(languageColumn, new ColumnWeightData(1, MINIMUM_COLUMN_WIDTH, true));
|
||||||
|
tableParent.setLayout(layout);
|
||||||
|
|
||||||
|
if (!fIsReadOnly) {
|
||||||
|
Composite buttons = new Composite(fContents, SWT.NONE);
|
||||||
|
buttons.setLayout(new GridLayout());
|
||||||
|
buttons.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
|
||||||
|
|
||||||
|
Button addButton = new Button(buttons, SWT.PUSH);
|
||||||
|
addButton.setText(PreferencesMessages.ProjectLanguagesPropertyPage_addMappingButton);
|
||||||
|
addButton.addListener(SWT.Selection, new Listener() {
|
||||||
|
public void handleEvent(Event event) {
|
||||||
|
ContentTypeMappingDialog dialog = new ContentTypeMappingDialog(fContents.getShell());
|
||||||
|
dialog.setContentTypeFilter(fContentTypeMappings.keySet());
|
||||||
|
dialog.setBlockOnOpen(true);
|
||||||
|
|
||||||
|
if (dialog.open() == Window.OK) {
|
||||||
|
String contentType = dialog.getContentTypeID();
|
||||||
|
String language = dialog.getLanguageID();
|
||||||
|
fContentTypeMappings.put(contentType, language);
|
||||||
|
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
|
||||||
|
fAffectedContentTypes.add(contentTypeManager.getContentType(contentType));
|
||||||
|
refreshMappings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Button removeButton = new Button(buttons, SWT.PUSH);
|
||||||
|
removeButton.setText(PreferencesMessages.ProjectLanguagesPropertyPage_removeMappingButton);
|
||||||
|
removeButton.addListener(SWT.Selection, new Listener() {
|
||||||
|
|
||||||
|
public void handleEvent(Event event) {
|
||||||
|
TableItem[] selection = fTable.getSelection();
|
||||||
|
|
||||||
|
for (int i = 0; i < selection.length; i++) {
|
||||||
|
String contentType = (String) fContentTypeNamesToIDsMap.get(selection[i].getText(0));
|
||||||
|
|
||||||
|
fContentTypeMappings.remove(contentType);
|
||||||
|
|
||||||
|
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
|
||||||
|
fAffectedContentTypes.add(contentTypeManager.getContentType(contentType));
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshMappings();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshMappings();
|
||||||
|
return fContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createHeader(Composite parent, String description) {
|
||||||
|
Link link = new Link(fContents, SWT.NONE);
|
||||||
|
link.setText(description);
|
||||||
|
|
||||||
|
link.addListener(SWT.Selection, new LanguageMappingLinkListener(fContents.getShell(), getElement()) {
|
||||||
|
protected void refresh() {
|
||||||
|
refreshMappings();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
|
||||||
|
gridData.horizontalSpan = 2;
|
||||||
|
link.setLayoutData(gridData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IAdaptable getElement() {
|
||||||
|
return fElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setElement(IAdaptable element) {
|
||||||
|
fElement = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refreshMappings() {
|
||||||
|
if (fTable == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fTable.removeAll();
|
||||||
|
Iterator mappings = fContentTypeMappings.entrySet().iterator();
|
||||||
|
|
||||||
|
IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
|
||||||
|
|
||||||
|
while (mappings.hasNext()) {
|
||||||
|
Entry entry = (Entry) mappings.next();
|
||||||
|
|
||||||
|
TableItem item = new TableItem(fTable, SWT.NONE);
|
||||||
|
|
||||||
|
String contentType = (String) entry.getKey();
|
||||||
|
String contentTypeName = contentTypeManager.getContentType(contentType).getName();
|
||||||
|
String languageName = LanguageManager.getInstance().getLanguage((String) entry.getValue()).getName();
|
||||||
|
|
||||||
|
if (fOverriddenContentTypes.contains(contentType)) {
|
||||||
|
item.setText(0, Messages.format(PreferencesMessages.ProjectLanguagesPropertyPage_overriddenContentType, contentTypeName));
|
||||||
|
item.setFont(fOverriddenFont);
|
||||||
|
} else {
|
||||||
|
item.setText(0, contentTypeName);
|
||||||
|
}
|
||||||
|
item.setText(1, languageName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChild != null) {
|
||||||
|
Set overrides = new HashSet(fContentTypeMappings.keySet());
|
||||||
|
overrides.addAll(fOverriddenContentTypes);
|
||||||
|
fChild.setOverriddenContentTypes(overrides);
|
||||||
|
fChild.refreshMappings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOverriddenContentTypes(Set contentTypes) {
|
||||||
|
fOverriddenContentTypes = contentTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMappings(Map mappings) {
|
||||||
|
fContentTypeMappings = new TreeMap(mappings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IContentType[] getAffectedContentTypes() {
|
||||||
|
return (IContentType[]) fAffectedContentTypes.toArray(new IContentType[fAffectedContentTypes.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map getContentTypeMappings() {
|
||||||
|
return Collections.unmodifiableMap(fContentTypeMappings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReadOnly(boolean isReadOnly) {
|
||||||
|
fIsReadOnly = isReadOnly;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChild(LanguageMappingWidget child) {
|
||||||
|
fChild = child;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,200 +10,122 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.language;
|
package org.eclipse.cdt.internal.ui.language;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.Platform;
|
|
||||||
import org.eclipse.core.runtime.content.IContentType;
|
import org.eclipse.core.runtime.content.IContentType;
|
||||||
import org.eclipse.core.runtime.content.IContentTypeManager;
|
|
||||||
import org.eclipse.jface.layout.TableColumnLayout;
|
|
||||||
import org.eclipse.jface.preference.PreferencePage;
|
import org.eclipse.jface.preference.PreferencePage;
|
||||||
import org.eclipse.jface.viewers.ColumnWeightData;
|
|
||||||
import org.eclipse.jface.window.Window;
|
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.layout.FillLayout;
|
||||||
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.Button;
|
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
import org.eclipse.swt.widgets.Control;
|
import org.eclipse.swt.widgets.Control;
|
||||||
import org.eclipse.swt.widgets.Event;
|
import org.eclipse.swt.widgets.Group;
|
||||||
import org.eclipse.swt.widgets.Listener;
|
|
||||||
import org.eclipse.swt.widgets.Table;
|
|
||||||
import org.eclipse.swt.widgets.TableColumn;
|
|
||||||
import org.eclipse.swt.widgets.TableItem;
|
|
||||||
import org.eclipse.ui.dialogs.PropertyPage;
|
import org.eclipse.ui.dialogs.PropertyPage;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
|
||||||
|
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
|
||||||
|
import org.eclipse.cdt.core.model.ILanguageMappingChangeEvent;
|
||||||
|
import org.eclipse.cdt.core.model.ILanguageMappingChangeListener;
|
||||||
import org.eclipse.cdt.core.model.LanguageManager;
|
import org.eclipse.cdt.core.model.LanguageManager;
|
||||||
|
|
||||||
|
|
||||||
import org.eclipse.cdt.internal.ui.preferences.PreferencesMessages;
|
import org.eclipse.cdt.internal.ui.preferences.PreferencesMessages;
|
||||||
|
|
||||||
public class ProjectLanguageMappingPropertyPage extends PropertyPage {
|
public class ProjectLanguageMappingPropertyPage extends PropertyPage {
|
||||||
|
|
||||||
private static final int MINIMUM_COLUMN_WIDTH = 150;
|
private LanguageMappingWidget fMappingWidget;
|
||||||
|
private LanguageMappingWidget fInheritedMappingWidget;
|
||||||
private ProjectLanguageConfiguration fMappings;
|
private ProjectLanguageConfiguration fMappings;
|
||||||
private Table fTable;
|
private ILanguageMappingChangeListener fInheritedMappingsChangeListener;
|
||||||
private HashMap fContentTypeNamesToIDsMap;
|
|
||||||
|
|
||||||
public ProjectLanguageMappingPropertyPage() {
|
public ProjectLanguageMappingPropertyPage() {
|
||||||
super();
|
super();
|
||||||
|
fMappingWidget = new LanguageMappingWidget();
|
||||||
// keep a mapping of all registered content types and their names
|
|
||||||
fContentTypeNamesToIDsMap = new HashMap();
|
fInheritedMappingWidget = new LanguageMappingWidget();
|
||||||
String[] contentTypesIDs = LanguageManager.getInstance()
|
fInheritedMappingWidget.setReadOnly(true);
|
||||||
.getRegisteredContentTypeIds();
|
|
||||||
|
fMappingWidget.setChild(fInheritedMappingWidget);
|
||||||
IContentTypeManager contentTypeManager = Platform
|
|
||||||
.getContentTypeManager();
|
|
||||||
|
|
||||||
for (int i = 0; i < contentTypesIDs.length; i++) {
|
|
||||||
|
|
||||||
String name = contentTypeManager.getContentType(contentTypesIDs[i])
|
|
||||||
.getName();
|
|
||||||
|
|
||||||
// keep track of what ID this name corresponds to so that when we
|
|
||||||
// setup the mapping
|
|
||||||
// later based upon user selection, we'll know what ID to use
|
|
||||||
fContentTypeNamesToIDsMap.put(name, contentTypesIDs[i]);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see PreferencePage#createContents(Composite)
|
* @see PreferencePage#createContents(Composite)
|
||||||
*/
|
*/
|
||||||
protected Control createContents(Composite parent) {
|
protected Control createContents(Composite parent) {
|
||||||
fetchMappings();
|
fMappingWidget.setElement(getProject());
|
||||||
|
|
||||||
Composite composite = new Composite(parent, SWT.NONE);
|
|
||||||
composite
|
|
||||||
.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
|
|
||||||
composite.setLayout(new GridLayout(2, false));
|
|
||||||
|
|
||||||
Composite tableParent = new Composite(composite, SWT.NONE);
|
|
||||||
tableParent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
|
|
||||||
|
|
||||||
fTable = new Table(tableParent, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION);
|
Composite contents = new Composite(parent, SWT.NONE);
|
||||||
fTable.setHeaderVisible(true);
|
contents.setLayout(new GridLayout(1, false));
|
||||||
fTable.setLinesVisible(true);
|
|
||||||
|
fetchMappings(getProject());
|
||||||
TableColumn contentTypeColumn = new TableColumn(fTable, SWT.LEAD);
|
Composite contentTypeMappings = fMappingWidget.createContents(contents, PreferencesMessages.ProjectLanguagesPropertyPage_description);
|
||||||
contentTypeColumn
|
contentTypeMappings.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
|
||||||
.setText(PreferencesMessages.ProjectLanguagesPropertyPage_contentTypeColumn);
|
|
||||||
|
Group group = new Group(contents, SWT.SHADOW_IN);
|
||||||
TableColumn languageColumn = new TableColumn(fTable, SWT.LEAD);
|
group.setText(PreferencesMessages.ProjectLanguagesPropertyPage_inheritedWorkspaceMappingsGroup);
|
||||||
languageColumn
|
group.setLayout(new FillLayout());
|
||||||
.setText(PreferencesMessages.ProjectLanguagesPropertyPage_languageColumn);
|
group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
|
||||||
|
|
||||||
TableColumnLayout layout = new TableColumnLayout();
|
fetchWorkspaceMappings();
|
||||||
layout.setColumnData(contentTypeColumn, new ColumnWeightData(1,
|
fInheritedMappingWidget.createContents(group, null);
|
||||||
MINIMUM_COLUMN_WIDTH, true));
|
fInheritedMappingsChangeListener = new ILanguageMappingChangeListener() {
|
||||||
layout.setColumnData(languageColumn, new ColumnWeightData(1,
|
public void handleLanguageMappingChangeEvent(ILanguageMappingChangeEvent event) {
|
||||||
MINIMUM_COLUMN_WIDTH, true));
|
if (event.getType() == ILanguageMappingChangeEvent.TYPE_WORKSPACE) {
|
||||||
tableParent.setLayout(layout);
|
fetchWorkspaceMappings();
|
||||||
|
fInheritedMappingWidget.refreshMappings();
|
||||||
Composite buttons = new Composite(composite, SWT.NONE);
|
|
||||||
buttons.setLayout(new GridLayout());
|
|
||||||
buttons.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false,
|
|
||||||
false));
|
|
||||||
|
|
||||||
Button addButton = new Button(buttons, SWT.PUSH);
|
|
||||||
addButton
|
|
||||||
.setText(PreferencesMessages.ProjectLanguagesPropertyPage_addMappingButton);
|
|
||||||
addButton.addListener(SWT.Selection, new Listener() {
|
|
||||||
public void handleEvent(Event event) {
|
|
||||||
ContentTypeMappingDialog dialog = new ContentTypeMappingDialog(
|
|
||||||
getShell());
|
|
||||||
dialog.setContentTypeFilter(fMappings.getContentTypeMappings()
|
|
||||||
.keySet());
|
|
||||||
dialog.setBlockOnOpen(true);
|
|
||||||
|
|
||||||
if (dialog.open() == Window.OK) {
|
|
||||||
String contentType = dialog.getContentTypeID();
|
|
||||||
String language = dialog.getLanguageID();
|
|
||||||
fMappings.addContentTypeMapping(contentType, language);
|
|
||||||
refreshMappings();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
LanguageManager.getInstance().registerLanguageChangeListener(fInheritedMappingsChangeListener);
|
||||||
Button removeButton = new Button(buttons, SWT.PUSH);
|
|
||||||
removeButton
|
return contents;
|
||||||
.setText(PreferencesMessages.ProjectLanguagesPropertyPage_removeMappingButton);
|
|
||||||
removeButton.addListener(SWT.Selection, new Listener() {
|
|
||||||
|
|
||||||
public void handleEvent(Event event) {
|
|
||||||
TableItem[] selection = fTable.getSelection();
|
|
||||||
|
|
||||||
for (int i = 0; i < selection.length; i++) {
|
|
||||||
fMappings
|
|
||||||
.removeContentTypeMapping((String) fContentTypeNamesToIDsMap
|
|
||||||
.get(selection[i].getText(0)));
|
|
||||||
}
|
|
||||||
|
|
||||||
refreshMappings();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
refreshMappings();
|
|
||||||
return composite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void refreshMappings() {
|
private void fetchMappings(IProject project) {
|
||||||
fTable.removeAll();
|
try {
|
||||||
Iterator mappings = fMappings.getContentTypeMappings().entrySet()
|
LanguageManager manager = LanguageManager.getInstance();
|
||||||
.iterator();
|
fMappings = manager.getLanguageConfiguration(project);
|
||||||
|
fMappingWidget.setMappings(fMappings.getContentTypeMappings());
|
||||||
IContentTypeManager contentTypeManager = Platform
|
} catch (CoreException e) {
|
||||||
.getContentTypeManager();
|
CCorePlugin.log(e);
|
||||||
|
|
||||||
while (mappings.hasNext()) {
|
|
||||||
Entry entry = (Entry) mappings.next();
|
|
||||||
|
|
||||||
TableItem item = new TableItem(fTable, SWT.NONE);
|
|
||||||
|
|
||||||
String contentTypeName = contentTypeManager.getContentType(
|
|
||||||
(String) entry.getKey()).getName();
|
|
||||||
String languageName = LanguageManager.getInstance().getLanguage(
|
|
||||||
(String) entry.getValue()).getName();
|
|
||||||
|
|
||||||
item.setText(0, contentTypeName);
|
|
||||||
item.setText(1, languageName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void fetchMappings() {
|
private void fetchWorkspaceMappings() {
|
||||||
try {
|
try {
|
||||||
fMappings = LanguageManager.getInstance()
|
LanguageManager manager = LanguageManager.getInstance();
|
||||||
.getLanguageConfiguration(getProject());
|
WorkspaceLanguageConfiguration workspaceMappings = manager.getWorkspaceLanguageConfiguration();
|
||||||
|
fInheritedMappingWidget.setMappings(workspaceMappings.getWorkspaceMappings());
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void performDefaults() {
|
protected void performDefaults() {
|
||||||
fMappings = new ProjectLanguageConfiguration();
|
super.performDefaults();
|
||||||
|
fetchMappings(getProject());
|
||||||
|
fMappingWidget.refreshMappings();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean performOk() {
|
public boolean performOk() {
|
||||||
try {
|
try {
|
||||||
IContentType[] affectedContentTypes = null;
|
fMappings.setContentTypeMappings(fMappingWidget.getContentTypeMappings());
|
||||||
LanguageManager.getInstance().storeLanguageMappingConfiguration(
|
IContentType[] affectedContentTypes = fMappingWidget.getAffectedContentTypes();
|
||||||
getProject(), affectedContentTypes);
|
LanguageManager.getInstance().storeLanguageMappingConfiguration(getProject(), affectedContentTypes);
|
||||||
return true;
|
return true;
|
||||||
} catch (CoreException e) {
|
} catch (CoreException e) {
|
||||||
CCorePlugin.log(e);
|
CCorePlugin.log(e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
LanguageManager.getInstance().unregisterLanguageChangeListener(fInheritedMappingsChangeListener);
|
||||||
|
}
|
||||||
|
|
||||||
private IProject getProject() {
|
private IProject getProject() {
|
||||||
return (IProject) getElement().getAdapter(IProject.class);
|
return (IProject) getElement().getAdapter(IProject.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 IBM Corporation 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:
|
||||||
|
* IBM Corporation - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.internal.ui.language;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.content.IContentType;
|
||||||
|
import org.eclipse.jface.preference.PreferencePage;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.ui.IWorkbench;
|
||||||
|
import org.eclipse.ui.IWorkbenchPreferencePage;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
|
||||||
|
import org.eclipse.cdt.core.model.LanguageManager;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.internal.ui.preferences.PreferencesMessages;
|
||||||
|
|
||||||
|
public class WorkspaceLanguageMappingPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
|
||||||
|
|
||||||
|
WorkspaceLanguageConfiguration fMappings;
|
||||||
|
LanguageMappingWidget fMappingWidget;
|
||||||
|
|
||||||
|
public WorkspaceLanguageMappingPreferencePage() {
|
||||||
|
fMappingWidget = new LanguageMappingWidget();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Control createContents(Composite parent) {
|
||||||
|
try {
|
||||||
|
fMappings = LanguageManager.getInstance().getWorkspaceLanguageConfiguration();
|
||||||
|
fMappingWidget.setMappings(fMappings.getWorkspaceMappings());
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
return fMappingWidget.createContents(parent, PreferencesMessages.WorkspaceLanguagesPreferencePage_description);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(IWorkbench workbench) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean performOk() {
|
||||||
|
try {
|
||||||
|
IContentType[] affectedContentTypes = fMappingWidget.getAffectedContentTypes();
|
||||||
|
LanguageManager manager = LanguageManager.getInstance();
|
||||||
|
WorkspaceLanguageConfiguration config = manager.getWorkspaceLanguageConfiguration();
|
||||||
|
config.setWorkspaceMappings(fMappingWidget.getContentTypeMappings());
|
||||||
|
manager.storeWorkspaceLanguageConfiguration(affectedContentTypes);
|
||||||
|
return true;
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void performDefaults() {
|
||||||
|
super.performDefaults();
|
||||||
|
try {
|
||||||
|
LanguageManager manager = LanguageManager.getInstance();
|
||||||
|
WorkspaceLanguageConfiguration config = manager.getWorkspaceLanguageConfiguration();
|
||||||
|
fMappingWidget.setMappings(config.getWorkspaceMappings());
|
||||||
|
} catch (CoreException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -193,15 +193,28 @@ public final class PreferencesMessages extends NLS {
|
||||||
public static String CodeFormatterPreferencePage_title;
|
public static String CodeFormatterPreferencePage_title;
|
||||||
public static String CodeFormatterPreferencePage_description;
|
public static String CodeFormatterPreferencePage_description;
|
||||||
|
|
||||||
|
public static String WorkspaceLanguagesPreferencePage_description;
|
||||||
|
|
||||||
|
public static String ProjectLanguagesPropertyPage_description;
|
||||||
public static String ProjectLanguagesPropertyPage_contentTypeColumn;
|
public static String ProjectLanguagesPropertyPage_contentTypeColumn;
|
||||||
public static String ProjectLanguagesPropertyPage_languageColumn;
|
public static String ProjectLanguagesPropertyPage_languageColumn;
|
||||||
public static String ProjectLanguagesPropertyPage_addMappingButton;
|
public static String ProjectLanguagesPropertyPage_addMappingButton;
|
||||||
public static String ProjectLanguagesPropertyPage_removeMappingButton;
|
public static String ProjectLanguagesPropertyPage_removeMappingButton;
|
||||||
|
public static String ProjectLanguagesPropertyPage_inheritedWorkspaceMappingsGroup;
|
||||||
|
public static String ProjectLanguagesPropertyPage_overriddenContentType;
|
||||||
|
|
||||||
public static String ContentTypeMappingsDialog_title;
|
public static String ContentTypeMappingsDialog_title;
|
||||||
public static String ContentTypeMappingsDialog_contentType;
|
public static String ContentTypeMappingsDialog_contentType;
|
||||||
public static String ContentTypeMappingsDialog_language;
|
public static String ContentTypeMappingsDialog_language;
|
||||||
|
|
||||||
|
public static String FileLanguagesPropertyPage_languageLabel;
|
||||||
|
public static String FileLanguagesPropertyPage_inheritedProjectMappingsGroup;
|
||||||
|
public static String FileLanguagesPropertyPage_contentTypeLabel;
|
||||||
|
public static String FileLanguagesPropertyPage_inheritedFromSystem;
|
||||||
|
public static String FileLanguagesPropertyPage_inheritedFromProject;
|
||||||
|
public static String FileLanguagesPropertyPage_inheritedFromWorkspace;
|
||||||
|
public static String FileLanguagesPropertyPage_description;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
NLS.initializeMessages(BUNDLE_NAME, PreferencesMessages.class);
|
NLS.initializeMessages(BUNDLE_NAME, PreferencesMessages.class);
|
||||||
}
|
}
|
||||||
|
|
|
@ -227,14 +227,27 @@ PathEntryVariablesBlock_removeVariableButton = &Remove
|
||||||
|
|
||||||
|
|
||||||
# Language settings
|
# Language settings
|
||||||
|
WorkspaceLanguagesPreferencePage_description = These settings are global to the entire workspace. They are overridden by project-specific language mappings.
|
||||||
|
|
||||||
|
ProjectLanguagesPropertyPage_description = These settings are project-specific. The mappings listed here override <a href="workspace">workspace-wide</a> language mappings.
|
||||||
ProjectLanguagesPropertyPage_contentTypeColumn = Content Type
|
ProjectLanguagesPropertyPage_contentTypeColumn = Content Type
|
||||||
ProjectLanguagesPropertyPage_languageColumn = Language
|
ProjectLanguagesPropertyPage_languageColumn = Language
|
||||||
ProjectLanguagesPropertyPage_addMappingButton = &Add...
|
ProjectLanguagesPropertyPage_addMappingButton = &Add...
|
||||||
ProjectLanguagesPropertyPage_removeMappingButton = &Remove
|
ProjectLanguagesPropertyPage_removeMappingButton = &Remove
|
||||||
|
ProjectLanguagesPropertyPage_inheritedWorkspaceMappingsGroup = Language settings inherited from the workspace
|
||||||
|
ProjectLanguagesPropertyPage_overriddenContentType = (Overridden) {0}
|
||||||
|
|
||||||
ContentTypeMappingsDialog_title = Add Mapping
|
ContentTypeMappingsDialog_title = Add Mapping
|
||||||
ContentTypeMappingsDialog_contentType = Content type
|
ContentTypeMappingsDialog_contentType = Content type
|
||||||
ContentTypeMappingsDialog_language = Language
|
ContentTypeMappingsDialog_language = Language
|
||||||
|
|
||||||
|
FileLanguagesPropertyPage_description = This language assignment overrides all <a href="project">project-wide</a> and <a href="workspace">workspace-wide</a> language mappings.
|
||||||
|
FileLanguagesPropertyPage_contentTypeLabel = Content Type:
|
||||||
|
FileLanguagesPropertyPage_languageLabel = Assigned Language:
|
||||||
|
FileLanguagesPropertyPage_inheritedProjectMappingsGroup = Language settings inherited from the project
|
||||||
|
FileLanguagesPropertyPage_inheritedFromSystem = Inherited from the system ({0})
|
||||||
|
FileLanguagesPropertyPage_inheritedFromProject = Inherited from the project ({0})
|
||||||
|
FileLanguagesPropertyPage_inheritedFromWorkspace = Inherited from the workspace ({0})
|
||||||
|
|
||||||
# Others
|
# Others
|
||||||
ProposalFilterPreferencesUtil_defaultFilterName=<Default Filter>
|
ProposalFilterPreferencesUtil_defaultFilterName=<Default Filter>
|
||||||
|
|
Loading…
Add table
Reference in a new issue