/******************************************************************************* * Copyright (c) 2007, 2015 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.Map; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.ui.dialogs.PropertyPage; import org.eclipse.cdt.core.language.ProjectLanguageConfiguration; import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ILanguage; 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.settings.model.ICProjectDescription; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.ui.preferences.PreferencesMessages; import org.eclipse.cdt.internal.ui.util.Messages; public class ProjectLanguageMappingPropertyPage extends PropertyPage { private ProjectLanguageMappingWidget fMappingWidget; private WorkspaceLanguageMappingWidget fInheritedMappingWidget; private ProjectLanguageConfiguration fMappings; private ILanguageMappingChangeListener fInheritedMappingsChangeListener; public ProjectLanguageMappingPropertyPage() { super(); fMappingWidget = new ProjectLanguageMappingWidget(); fInheritedMappingWidget = new WorkspaceLanguageMappingWidget(); fInheritedMappingWidget.setReadOnly(true); fMappingWidget.setChild(fInheritedMappingWidget); } /** * @see PreferencePage#createContents(Composite) */ @Override protected Control createContents(Composite parent) { fMappingWidget.setElement(getProject()); Composite contents = new Composite(parent, SWT.NONE); contents.setLayout(new GridLayout(1, false)); fetchMappings(getProject()); Composite contentTypeMappings = fMappingWidget.createContents(contents, PreferencesMessages.ProjectLanguagesPropertyPage_description); contentTypeMappings.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); Group group = new Group(contents, SWT.SHADOW_IN); group.setText(PreferencesMessages.ProjectLanguagesPropertyPage_inheritedWorkspaceMappingsGroup); group.setLayout(new FillLayout()); group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); fetchWorkspaceMappings(); fInheritedMappingWidget.createContents(group, null); fInheritedMappingsChangeListener = new ILanguageMappingChangeListener() { @Override public void handleLanguageMappingChangeEvent(final ILanguageMappingChangeEvent event) { if (event.getType() == ILanguageMappingChangeEvent.TYPE_WORKSPACE) { if (ProjectLanguageMappingPropertyPage.this.isControlCreated()) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (!ProjectLanguageMappingPropertyPage.this.getControl().isDisposed()) { fetchWorkspaceMappings(); fInheritedMappingWidget.refreshMappings(); } } }); } } else if (event.getType() == ILanguageMappingChangeEvent.TYPE_PROJECT) { if (ProjectLanguageMappingPropertyPage.this.isControlCreated()) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if (!ProjectLanguageMappingPropertyPage.this.getControl().isDisposed()) { fetchMappings(event.getProject()); fMappingWidget.refreshMappings(); } } }); } } } }; LanguageManager.getInstance().registerLanguageChangeListener(fInheritedMappingsChangeListener); return contents; } private void fetchMappings(IProject project) { try { LanguageManager manager = LanguageManager.getInstance(); fMappings = manager.getLanguageConfiguration(project); ICProjectDescription description = CoreModel.getDefault().getProjectDescription(project); Map<String, ILanguage> availableLanguages = LanguageVerifier.computeAvailableLanguages(); Set<String> missingLanguages = LanguageVerifier.removeMissingLanguages(fMappings, description, availableLanguages); if (missingLanguages.size() > 0) { MessageBox messageBox = new MessageBox(getShell(), SWT.ICON_WARNING | SWT.OK); messageBox.setText(PreferencesMessages.LanguageMappings_missingLanguageTitle); String affectedLanguages = LanguageVerifier.computeAffectedLanguages(missingLanguages); messageBox.setMessage(Messages.format(PreferencesMessages.ProjectLanguagesPropertyPage_missingLanguage, affectedLanguages)); messageBox.open(); } fMappingWidget.setMappings(fMappings.getContentTypeMappings()); } catch (CoreException e) { CUIPlugin.log(e); } } private void fetchWorkspaceMappings() { try { LanguageManager manager = LanguageManager.getInstance(); WorkspaceLanguageConfiguration workspaceMappings = manager.getWorkspaceLanguageConfiguration(); Map<String, ILanguage> availableLanguages = LanguageVerifier.computeAvailableLanguages(); Set<String> missingLanguages = LanguageVerifier.removeMissingLanguages(workspaceMappings, availableLanguages); if (missingLanguages.size() > 0) { MessageBox messageBox = new MessageBox(getShell(), SWT.ICON_WARNING | SWT.OK); messageBox.setText(PreferencesMessages.LanguageMappings_missingLanguageTitle); String affectedLanguages = LanguageVerifier.computeAffectedLanguages(missingLanguages); messageBox.setMessage(Messages.format(PreferencesMessages.WorkspaceLanguagesPreferencePage_missingLanguage, affectedLanguages)); messageBox.open(); } fInheritedMappingWidget.setMappings(workspaceMappings.getWorkspaceMappings()); } catch (CoreException e) { CUIPlugin.log(e); } } @Override protected void performDefaults() { super.performDefaults(); fetchMappings(getProject()); fMappingWidget.refreshMappings(); } @Override public boolean performOk() { try { if (!fMappingWidget.isChanged()) { return true; } fMappings.setContentTypeMappings(fMappingWidget.getContentTypeMappings()); IContentType[] affectedContentTypes = fMappingWidget.getAffectedContentTypes(); LanguageManager.getInstance().storeLanguageMappingConfiguration(getProject(), affectedContentTypes); fMappingWidget.setChanged(false); return true; } catch (CoreException e) { CUIPlugin.log(e); return false; } } @Override public void dispose() { super.dispose(); LanguageManager.getInstance().unregisterLanguageChangeListener(fInheritedMappingsChangeListener); } private IProject getProject() { return getElement().getAdapter(IProject.class); } }