1
/*******************************************************************************
2
* Copyright (c) 2007, 2009 IBM Corporation and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* IBM Corporation - Initial API and implementation
10
*******************************************************************************/
11
package org.eclipse.cdt.internal.ui.language;
16
import org.eclipse.core.resources.IProject;
17
import org.eclipse.core.runtime.CoreException;
18
import org.eclipse.core.runtime.content.IContentType;
19
import org.eclipse.jface.preference.PreferencePage;
20
import org.eclipse.swt.SWT;
21
import org.eclipse.swt.layout.FillLayout;
22
import org.eclipse.swt.layout.GridData;
23
import org.eclipse.swt.layout.GridLayout;
24
import org.eclipse.swt.widgets.Composite;
25
import org.eclipse.swt.widgets.Control;
26
import org.eclipse.swt.widgets.Display;
27
import org.eclipse.swt.widgets.Group;
28
import org.eclipse.swt.widgets.MessageBox;
29
import org.eclipse.ui.dialogs.PropertyPage;
31
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
32
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
33
import org.eclipse.cdt.core.model.CoreModel;
34
import org.eclipse.cdt.core.model.ILanguage;
35
import org.eclipse.cdt.core.model.ILanguageMappingChangeEvent;
36
import org.eclipse.cdt.core.model.ILanguageMappingChangeListener;
37
import org.eclipse.cdt.core.model.LanguageManager;
38
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
39
import org.eclipse.cdt.ui.CUIPlugin;
41
import org.eclipse.cdt.internal.ui.preferences.PreferencesMessages;
42
import org.eclipse.cdt.internal.ui.util.Messages;
44
public class ProjectLanguageMappingPropertyPage extends PropertyPage {
46
private ProjectLanguageMappingWidget fMappingWidget;
47
private WorkspaceLanguageMappingWidget fInheritedMappingWidget;
48
private ProjectLanguageConfiguration fMappings;
49
private ILanguageMappingChangeListener fInheritedMappingsChangeListener;
51
public ProjectLanguageMappingPropertyPage() {
53
fMappingWidget = new ProjectLanguageMappingWidget();
55
fInheritedMappingWidget = new WorkspaceLanguageMappingWidget();
56
fInheritedMappingWidget.setReadOnly(true);
58
fMappingWidget.setChild(fInheritedMappingWidget);
62
* @see PreferencePage#createContents(Composite)
65
protected Control createContents(Composite parent) {
66
fMappingWidget.setElement(getProject());
68
Composite contents = new Composite(parent, SWT.NONE);
69
contents.setLayout(new GridLayout(1, false));
71
fetchMappings(getProject());
72
Composite contentTypeMappings = fMappingWidget.createContents(contents, PreferencesMessages.ProjectLanguagesPropertyPage_description);
73
contentTypeMappings.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
75
Group group = new Group(contents, SWT.SHADOW_IN);
76
group.setText(PreferencesMessages.ProjectLanguagesPropertyPage_inheritedWorkspaceMappingsGroup);
77
group.setLayout(new FillLayout());
78
group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
80
fetchWorkspaceMappings();
81
fInheritedMappingWidget.createContents(group, null);
82
fInheritedMappingsChangeListener = new ILanguageMappingChangeListener() {
83
public void handleLanguageMappingChangeEvent(final ILanguageMappingChangeEvent event) {
84
if (event.getType() == ILanguageMappingChangeEvent.TYPE_WORKSPACE) {
85
if (ProjectLanguageMappingPropertyPage.this.isControlCreated()) {
86
Display.getDefault().asyncExec(new Runnable() {
88
if (!ProjectLanguageMappingPropertyPage.this.getControl().isDisposed()) {
89
fetchWorkspaceMappings();
90
fInheritedMappingWidget.refreshMappings();
96
else if (event.getType() == ILanguageMappingChangeEvent.TYPE_PROJECT) {
97
if (ProjectLanguageMappingPropertyPage.this.isControlCreated()) {
98
Display.getDefault().asyncExec(new Runnable() {
100
if (!ProjectLanguageMappingPropertyPage.this.getControl().isDisposed()) {
101
fetchMappings(event.getProject());
102
fMappingWidget.refreshMappings();
110
LanguageManager.getInstance().registerLanguageChangeListener(fInheritedMappingsChangeListener);
115
private void fetchMappings(IProject project) {
117
LanguageManager manager = LanguageManager.getInstance();
118
fMappings = manager.getLanguageConfiguration(project);
120
ICProjectDescription description = CoreModel.getDefault().getProjectDescription(project);
121
Map<String, ILanguage> availableLanguages = LanguageVerifier.computeAvailableLanguages();
122
Set<String> missingLanguages = LanguageVerifier.removeMissingLanguages(fMappings, description, availableLanguages);
123
if (missingLanguages.size() > 0) {
124
MessageBox messageBox = new MessageBox(getShell(), SWT.ICON_WARNING | SWT.OK);
125
messageBox.setText(PreferencesMessages.LanguageMappings_missingLanguageTitle);
126
String affectedLanguages = LanguageVerifier.computeAffectedLanguages(missingLanguages);
127
messageBox.setMessage(Messages.format(PreferencesMessages.ProjectLanguagesPropertyPage_missingLanguage, affectedLanguages));
131
fMappingWidget.setMappings(fMappings.getContentTypeMappings());
132
} catch (CoreException e) {
137
private void fetchWorkspaceMappings() {
139
LanguageManager manager = LanguageManager.getInstance();
140
WorkspaceLanguageConfiguration workspaceMappings = manager.getWorkspaceLanguageConfiguration();
142
Map<String, ILanguage> availableLanguages = LanguageVerifier.computeAvailableLanguages();
143
Set<String> missingLanguages = LanguageVerifier.removeMissingLanguages(workspaceMappings, availableLanguages);
144
if (missingLanguages.size() > 0) {
145
MessageBox messageBox = new MessageBox(getShell(), SWT.ICON_WARNING | SWT.OK);
146
messageBox.setText(PreferencesMessages.LanguageMappings_missingLanguageTitle);
147
String affectedLanguages = LanguageVerifier.computeAffectedLanguages(missingLanguages);
148
messageBox.setMessage(Messages.format(PreferencesMessages.WorkspaceLanguagesPreferencePage_missingLanguage, affectedLanguages));
152
fInheritedMappingWidget.setMappings(workspaceMappings.getWorkspaceMappings());
153
} catch (CoreException e) {
159
protected void performDefaults() {
160
super.performDefaults();
161
fetchMappings(getProject());
162
fMappingWidget.refreshMappings();
166
public boolean performOk() {
168
if (!fMappingWidget.isChanged()) {
172
fMappings.setContentTypeMappings(fMappingWidget.getContentTypeMappings());
173
IContentType[] affectedContentTypes = fMappingWidget.getAffectedContentTypes();
174
LanguageManager.getInstance().storeLanguageMappingConfiguration(getProject(), affectedContentTypes);
175
fMappingWidget.setChanged(false);
177
} catch (CoreException e) {
184
public void dispose() {
186
LanguageManager.getInstance().unregisterLanguageChangeListener(fInheritedMappingsChangeListener);
189
private IProject getProject() {
190
return (IProject) getElement().getAdapter(IProject.class);