diff --git a/core/org.eclipse.cdt.ui/ChangeLog b/core/org.eclipse.cdt.ui/ChangeLog
index 63695d7c7b5..de677c551e2 100644
--- a/core/org.eclipse.cdt.ui/ChangeLog
+++ b/core/org.eclipse.cdt.ui/ChangeLog
@@ -1,3 +1,17 @@
+2005-06-08 Alain Magloire
+ Move to the IContentTypeManager framework: PR 86645
+ * src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java
+ * src/org/eclipse/cdt/internal/ui/editor/CEditor.java
+ + src/org/eclipse/cdt/internal/ui/preferences/CFileTypeAssociation.java
+ * src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java
+ * src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java
+ * src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java
+ * src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java
+ * src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties
+ * src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java
+ * src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java
+ * plugin.xml
+
2005-06-08 Vladimir Hirsl
Fix for NPE in CPElement.java
diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml
index c2ded7d8bb2..916fc50db43 100644
--- a/core/org.eclipse.cdt.ui/plugin.xml
+++ b/core/org.eclipse.cdt.ui/plugin.xml
@@ -522,19 +522,23 @@
+
+
+
+
+
+
@@ -762,7 +765,6 @@
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java
index e85b743069f..729f4c4f2dc 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java
@@ -20,7 +20,7 @@ public class CFileElementWorkingCopy extends WorkingCopy {
* Creates a working copy of this element
*/
public CFileElementWorkingCopy(ITranslationUnit unit) throws CoreException {
- super(unit.getParent(), unit.getPath(), null);
+ super(unit.getParent(), unit.getPath(), unit.getContentTypeId(), null);
this.unit = unit;
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
index 108ae3367c0..328e3cc5798 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
@@ -11,7 +11,6 @@ import java.util.Iterator;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CCorePreferenceConstants;
-import org.eclipse.cdt.core.filetype.ICFileType;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
@@ -44,6 +43,7 @@ import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
@@ -606,8 +606,10 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
if (originalElement instanceof IFileEditorInput) {
IFile file= ((IFileEditorInput) originalElement).getFile();
if (file != null) {
- ICFileType type = CCorePlugin.getDefault().getFileType(file.getProject(), file.getName());
- oldLanguage = type.getLanguage().getId();
+ IContentType type = CCorePlugin.getContentType(file.getProject(), file.getName());
+ if (type != null) {
+ oldLanguage = type.getId();
+ }
if (oldLanguage == null) {
return false;
}
@@ -618,8 +620,10 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
if (movedElement instanceof IFileEditorInput) {
IFile file = ((IFileEditorInput) movedElement).getFile();
if (file != null) {
- ICFileType type = CCorePlugin.getDefault().getFileType(file.getProject(), file.getName());
- newLanguage = type.getLanguage().getId();
+ IContentType type = CCorePlugin.getContentType(file.getProject(), file.getName());
+ if (type != null) {
+ newLanguage = type.getId();
+ }
if (newLanguage == null) {
return false;
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeAssociation.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeAssociation.java
new file mode 100644
index 00000000000..81bdb0b77b0
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeAssociation.java
@@ -0,0 +1,92 @@
+/**********************************************************************
+ * Copyright (c) 2005 QNX Software System and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * QNX Software System - Initial implementation
+***********************************************************************/
+
+package org.eclipse.cdt.internal.ui.preferences;
+
+import org.eclipse.core.runtime.content.IContentType;
+
+public class CFileTypeAssociation {
+
+ private String fSpec;
+ private int fType;
+ private IContentType fContentType;
+
+ /**
+ * @param spec
+ * @param type
+ * @param settings
+ */
+ public CFileTypeAssociation(String spec, int type, IContentType contentType) {
+ super();
+ fSpec = spec;
+ fType = type;
+ fContentType = contentType;
+ }
+
+ /**
+ * @return Returns the fSettings.
+ */
+ public IContentType getContentType() {
+ return fContentType;
+ }
+
+ /**
+ * @return Returns the fSpec.
+ */
+ public String getSpec() {
+ return fSpec;
+ }
+
+ public String getPattern() {
+ String pattern = getSpec();
+ if (isExtSpec()) {
+ return "*." + pattern; //$NON-NLS-1$
+ }
+ return pattern;
+
+ }
+
+ /**
+ * @return
+ */
+ public boolean isFileSpec() {
+ return (fType & IContentType.FILE_NAME_SPEC) != 0;
+ }
+
+ /**
+ * @return
+ */
+ public boolean isExtSpec() {
+ return (fType & IContentType.FILE_EXTENSION_SPEC) != 0;
+ }
+
+ /**
+ * @return
+ */
+ public boolean isPredefined() {
+ return (fType & IContentType.IGNORE_USER_DEFINED) != 0;
+ }
+
+ /**
+ * @return
+ */
+ public boolean isUserDefined() {
+ return (fType & IContentType.IGNORE_PRE_DEFINED) != 0;
+ }
+
+ /**
+ * @return Returns the description.
+ */
+ public String getDescription() {
+ return fContentType.getName();
+ }
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java
index ac64224553d..70f3dd035ff 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java
@@ -10,9 +10,12 @@
***********************************************************************/
package org.eclipse.cdt.internal.ui.preferences;
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileType;
-import org.eclipse.cdt.core.filetype.IResolverModel;
+import java.util.ArrayList;
+
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
@@ -29,7 +32,7 @@ import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class CFileTypeDialog extends Dialog {
-
+
public CFileTypeDialog(Shell parentShell) {
super(parentShell);
}
@@ -38,7 +41,7 @@ public class CFileTypeDialog extends Dialog {
private Combo fComboType;
private String fPattern;
- private ICFileType fType;
+ private IContentType fType;
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
@@ -99,23 +102,30 @@ public class CFileTypeDialog extends Dialog {
return fPattern;
}
- public void setType(ICFileType type) {
- fType = type;
- }
-
- public ICFileType getType() {
+ public IContentType getContentType() {
return fType;
}
private void populateTypesCombo() {
- ICFileType[] types = getResolverModel().getFileTypes();
- int index = -1;
+ IContentTypeManager manager = Platform.getContentTypeManager();
+ String[] ids = CoreModel.getRegistedContentTypeIds();
+ ArrayList list = new ArrayList(ids.length);
+ for (int i = 0; i < ids.length; i++) {
+ IContentType ctype = manager.getContentType(ids[i]);
+ if (ctype != null) {
+ list.add(ctype);
+ }
+ }
- for (int i = 0; i < types.length; i++) {
- fComboType.add(types[i].getName());
+ IContentType[] ctypes = new IContentType[list.size()];
+ list.toArray(ctypes);
+ int index = -1;
+
+ for (int i = 0; i < ctypes.length; i++) {
+ fComboType.add(ctypes[i].getName());
}
- fComboType.setData(types);
+ fComboType.setData(ctypes);
if (null != fType) {
index = fComboType.indexOf(fType.getName());
@@ -124,10 +134,6 @@ public class CFileTypeDialog extends Dialog {
fComboType.select((index < 0) ? 0 : index);
}
- private IResolverModel getResolverModel() {
- return CCorePlugin.getDefault().getResolverModel();
- }
-
Button getOkayButton() {
return getButton(IDialogConstants.OK_ID);
}
@@ -136,21 +142,20 @@ public class CFileTypeDialog extends Dialog {
return fTextPattern.getText().trim();
}
- private ICFileType getTypeFromControl() {
- String typeId = null;
+ private IContentType getTypeFromControl() {
+ IContentType type = null;
int index = fComboType.getSelectionIndex();
if (-1 != index) {
String name = fComboType.getItem(index);
- ICFileType[] types = (ICFileType[]) fComboType.getData();
+ IContentType[] types = (IContentType[]) fComboType.getData();
for (int i = 0; i < types.length; i++) {
if (name.equals(types[i].getName())) {
- typeId = types[i].getId();
+ type = types[i];
}
}
}
-
- return getResolverModel().getFileTypeById(typeId);
+ return type;
}
protected void okPressed() {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java
index f3d092bec78..e068fb9ff93 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java
@@ -12,13 +12,19 @@ package org.eclipse.cdt.internal.ui.preferences;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.List;
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileTypeAssociation;
-import org.eclipse.cdt.core.filetype.ICFileTypeResolver;
-import org.eclipse.cdt.core.filetype.IResolverModel;
+import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.internal.ui.util.PixelConverter;
import org.eclipse.cdt.internal.ui.util.SWTUtil;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+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.IContentTypeManager;
+import org.eclipse.core.runtime.content.IContentTypeSettings;
+import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.jface.util.ListenerList;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ILabelProvider;
@@ -53,22 +59,23 @@ public class CFileTypesPreferenceBlock {
private static final int COL_PATTERN = 0;
private static final int COL_DESCRIPTION = 1;
- private static final int COL_LANGUAGE = 2;
-
- private ICFileTypeResolver fResolverWorkingCopy;
- private ArrayList fAddAssoc;
- private ArrayList fRemoveAssoc;
- private boolean fDirty = false;
+ private static final int COL_STATUS = 2;
+ private ArrayList fAddAssoc;
+ private ArrayList fRemoveAssoc;
+ private boolean fDirty = false;
+ private IProject fInput;
+ private IContentType[] fContentTypes;
+
private TableViewer fAssocViewer;
private Button fBtnNew;
private Button fBtnRemove;
-
+
private class AssocSorter extends ViewerSorter {
public int category(Object element) {
- if (element instanceof ICFileTypeAssociation) {
- ICFileTypeAssociation assoc = (ICFileTypeAssociation) element;
- if (-1 != assoc.getPattern().indexOf('*')) {
+ if (element instanceof CFileTypeAssociation) {
+ CFileTypeAssociation assoc = (CFileTypeAssociation) element;
+ if (assoc.isExtSpec()) {
return 10;
}
return 20;
@@ -78,7 +85,7 @@ public class CFileTypesPreferenceBlock {
}
private class AssocContentProvider implements IStructuredContentProvider {
- ICFileTypeAssociation[] assocs;
+ CFileTypeAssociation[] assocs;
public Object[] getElements(Object inputElement) {
return assocs;
@@ -89,8 +96,8 @@ public class CFileTypesPreferenceBlock {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- if (newInput instanceof ICFileTypeAssociation[]) {
- assocs = (ICFileTypeAssociation[]) newInput;
+ if (newInput instanceof CFileTypeAssociation[]) {
+ assocs = (CFileTypeAssociation[]) newInput;
}
}
}
@@ -99,9 +106,8 @@ public class CFileTypesPreferenceBlock {
private ListenerList listeners = new ListenerList();
public Image getColumnImage(Object element, int columnIndex) {
- if (element instanceof ICFileTypeAssociation) {
+ if (element instanceof CFileTypeAssociation) {
if (COL_PATTERN == columnIndex) {
- // TODO: add image support to table
return null;
}
}
@@ -109,17 +115,22 @@ public class CFileTypesPreferenceBlock {
}
public String getColumnText(Object element, int columnIndex) {
- if (element instanceof ICFileTypeAssociation) {
- ICFileTypeAssociation assoc = (ICFileTypeAssociation) element;
+ if (element instanceof CFileTypeAssociation) {
+ CFileTypeAssociation assoc = (CFileTypeAssociation) element;
switch (columnIndex) {
case COL_PATTERN:
return assoc.getPattern();
case COL_DESCRIPTION:
- return assoc.getType().getName();
+ return assoc.getDescription();
- case COL_LANGUAGE:
- return assoc.getType().getLanguage().getName();
+ case COL_STATUS:
+ if (assoc.isUserDefined()) {
+ return PreferencesMessages.getString("CFileTypesPreferencePage.userDefined"); //$NON-NLS-1$
+ } else if (assoc.isPredefined()) {
+ return PreferencesMessages.getString("CFileTypesPreferencePage.preDefined"); //$NON-NLS-1$
+ }
+ return new String();
}
}
return element.toString();
@@ -151,11 +162,15 @@ public class CFileTypesPreferenceBlock {
}
}
-
- public CFileTypesPreferenceBlock(ICFileTypeResolver input) {
+
+ public CFileTypesPreferenceBlock() {
+ this(null);
+ }
+
+ public CFileTypesPreferenceBlock(IProject input) {
fAddAssoc = new ArrayList();
fRemoveAssoc = new ArrayList();
- setResolver(input);
+ fInput = input;
setDirty(false);
}
@@ -208,7 +223,7 @@ public class CFileTypesPreferenceBlock {
col.setText(PreferencesMessages.getString("CFileTypesPreferencePage.colTitleDescription")); //$NON-NLS-1$
col = new TableColumn(table, SWT.LEFT);
- col.setText(PreferencesMessages.getString("CFileTypesPreferencePage.colTitleLanguage")); //$NON-NLS-1$
+ col.setText(PreferencesMessages.getString("CFileTypesPreferencePage.colTitleStatus")); //$NON-NLS-1$
// Create the button pane
@@ -260,7 +275,7 @@ public class CFileTypesPreferenceBlock {
fAssocViewer.setSorter(new AssocSorter());
fAssocViewer.setContentProvider(new AssocContentProvider());
fAssocViewer.setLabelProvider(new AssocLabelProvider());
- fAssocViewer.setInput(getResolverWorkingCopy().getFileTypeAssociations());
+ fAssocViewer.setInput(getCFileTypeAssociations());
fAssocViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
@@ -280,25 +295,32 @@ public class CFileTypesPreferenceBlock {
setDirty(enabled);
}
- public void setResolver(ICFileTypeResolver resolver) {
+ public void setInput(IProject input) {
fAddAssoc.clear();
fRemoveAssoc.clear();
- fResolverWorkingCopy = resolver.createWorkingCopy();
+ fInput = input;
if (null != fAssocViewer) {
- fAssocViewer.setInput(fResolverWorkingCopy.getFileTypeAssociations());
+ fAssocViewer.setInput(getCFileTypeAssociations());
}
setDirty(true);
}
- public ICFileTypeResolver getResolverWorkingCopy() {
- return fResolverWorkingCopy;
+ public void setInputWithCopy(IProject input) {
+ fAddAssoc.clear();
+ fRemoveAssoc.clear();
+ fInput = null;
+ if (null != fAssocViewer) {
+ fAssocViewer.setInput(getCFileTypeAssociations());
+ }
+ fInput = input;
+ setDirty(true);
}
-
- public void setDirty(boolean dirty) {
+
+ private void setDirty(boolean dirty) {
fDirty = dirty;
}
- public boolean isDirty() {
+ private boolean isDirty() {
return fDirty;
}
@@ -306,36 +328,165 @@ public class CFileTypesPreferenceBlock {
boolean changed = fDirty;
if (fDirty) {
- ICFileTypeAssociation[] add = (ICFileTypeAssociation[]) fAddAssoc.toArray(new ICFileTypeAssociation[fAddAssoc.size()]);
- ICFileTypeAssociation[] rem = (ICFileTypeAssociation[]) fRemoveAssoc.toArray(new ICFileTypeAssociation[fRemoveAssoc.size()]);
+ CFileTypeAssociation[] add = (CFileTypeAssociation[]) fAddAssoc.toArray(new CFileTypeAssociation[fAddAssoc.size()]);
+ CFileTypeAssociation[] rem = (CFileTypeAssociation[]) fRemoveAssoc.toArray(new CFileTypeAssociation[fRemoveAssoc.size()]);
- fResolverWorkingCopy.adjustAssociations(add, rem);
+ adjustAssociations(add, rem);
fAddAssoc.clear();
fRemoveAssoc.clear();
setDirty(false);
- }
-
+ }
return changed;
}
- protected void handleSelectionChanged() {
- IStructuredSelection sel = getSelection();
- fBtnRemove.setEnabled(!sel.isEmpty());
+ private CFileTypeAssociation[] getCFileTypeAssociations() {
+ ArrayList list = new ArrayList();
+ if (fInput == null) {
+ fillWithUserDefinedCFileTypeAssociations(list);
+ fillWithPredefinedCFileTypeAssociations(list);
+ } else {
+ fillWithProjectCFileTypeAssociations(list, fInput);
+ }
+ CFileTypeAssociation[] assocs = new CFileTypeAssociation[list.size()];
+ list.toArray(assocs);
+ return assocs;
}
- private IResolverModel getResolverModel() {
- return CCorePlugin.getDefault().getResolverModel();
+ private void adjustAssociations(CFileTypeAssociation[] add, CFileTypeAssociation[] rem) {
+ IScopeContext context = null;
+ if (fInput != null) {
+ context = new ProjectScope(fInput);
+ }
+ addAssociations(add, context);
+ removeAssociations(rem, context);
}
-
+
+ private void addAssociations(CFileTypeAssociation[] add, IScopeContext context) {
+ for (int i = 0; i < add.length; ++i) {
+ CFileTypeAssociation assoc = add[i];
+ String spec = assoc.getSpec();
+ IContentType contentType = assoc.getContentType();
+ int type = IContentType.FILE_NAME_SPEC;
+ if (assoc.isExtSpec()) {
+ type = IContentType.FILE_EXTENSION_SPEC;
+ }
+ addAssociation(context, contentType, spec, type);
+ }
+ }
+
+ protected void addAssociation(IScopeContext context, IContentType contentType, String spec, int type) {
+ try {
+ IContentTypeSettings settings = contentType.getSettings(context);
+ settings.addFileSpec(spec, type);
+ } catch (CoreException e) {
+ // ignore ??
+ }
+ }
+
+ private void removeAssociations(CFileTypeAssociation[] rem, IScopeContext context) {
+ for (int i = 0; i < rem.length; ++i) {
+ CFileTypeAssociation assoc = rem[i];
+ IContentType contentType = assoc.getContentType();
+ String spec = assoc.getSpec();
+ int type = IContentType.FILE_NAME_SPEC;
+ if (assoc.isExtSpec()) {
+ type = IContentType.FILE_EXTENSION_SPEC;
+ }
+ removeAssociation(context, contentType, spec, type);
+ }
+ }
+
+ protected void removeAssociation(IScopeContext context, IContentType contentType, String spec, int type) {
+ try {
+ IContentTypeSettings settings = contentType.getSettings(context);
+ settings.removeFileSpec(spec, type);
+ } catch (CoreException e) {
+ // ignore ??
+ }
+ }
+
+ private IContentType[] getRegistedContentTypes() {
+ if (fContentTypes == null) {
+ String [] ids = CoreModel.getRegistedContentTypeIds();
+ IContentTypeManager manager = Platform.getContentTypeManager();
+ IContentType [] ctypes = new IContentType[ids.length];
+ for (int i = 0; i < ids.length; i++) {
+ ctypes[i] = manager.getContentType(ids[i]);
+ }
+ fContentTypes = ctypes;
+ }
+ return fContentTypes;
+ }
+
+ private void fillWithUserDefinedCFileTypeAssociations(ArrayList list) {
+ IContentType[] ctypes = getRegistedContentTypes();
+ fillWithCFileTypeAssociations(ctypes, null, IContentType.IGNORE_PRE_DEFINED | IContentType.FILE_EXTENSION_SPEC, list);
+ fillWithCFileTypeAssociations(ctypes, null, IContentType.IGNORE_PRE_DEFINED | IContentType.FILE_NAME_SPEC, list);
+ }
+
+ private void fillWithPredefinedCFileTypeAssociations(ArrayList list) {
+ IContentType[] ctypes = getRegistedContentTypes();
+ fillWithCFileTypeAssociations(ctypes, null, IContentType.IGNORE_USER_DEFINED | IContentType.FILE_EXTENSION_SPEC, list);
+ fillWithCFileTypeAssociations(ctypes, null, IContentType.IGNORE_USER_DEFINED | IContentType.FILE_NAME_SPEC, list);
+ }
+
+ private void fillWithProjectCFileTypeAssociations(ArrayList list, IProject project) {
+ IContentType[] ctypes = getRegistedContentTypes();
+ IScopeContext context = new ProjectScope(project);
+ fillWithCFileTypeAssociations(ctypes, context, IContentType.IGNORE_PRE_DEFINED | IContentType.FILE_EXTENSION_SPEC, list);
+ fillWithCFileTypeAssociations(ctypes, context, IContentType.IGNORE_PRE_DEFINED | IContentType.FILE_NAME_SPEC, list);
+ }
+
+ private void fillWithCFileTypeAssociations(IContentType[] ctypes, IScopeContext context, int type, ArrayList list) {
+ for (int i = 0; i < ctypes.length; i++) {
+ try {
+ IContentType ctype = ctypes[i];
+ IContentTypeSettings setting = ctype.getSettings(context);
+ String[] specs = setting.getFileSpecs(type);
+ for (int j = 0; j < specs.length; j++) {
+ CFileTypeAssociation assoc = new CFileTypeAssociation(specs[j], type, ctype);
+ list.add(assoc);
+ }
+ } catch (CoreException e) {
+ // skip over it.
+ }
+ }
+ }
+
+ private CFileTypeAssociation createAssociation(String pattern, IContentType contentType) {
+ int type = IContentType.FILE_NAME_SPEC;
+ if (pattern.startsWith("*.")) { //$NON-NLS-1$
+ pattern = pattern.substring(2);
+ type = IContentType.FILE_EXTENSION_SPEC;
+ }
+ return new CFileTypeAssociation(pattern, type, contentType);
+ }
+
+ protected void handleSelectionChanged() {
+ IStructuredSelection sel = getSelection();
+ if (sel.isEmpty()) {
+ fBtnRemove.setEnabled(false);
+ } else {
+ boolean enabled = true;
+ List elements = sel.toList();
+ for (Iterator i = elements.iterator(); i.hasNext();) {
+ CFileTypeAssociation assoc = (CFileTypeAssociation) i.next();
+ if (assoc.isPredefined())
+ enabled = false;
+ }
+ fBtnRemove.setEnabled(enabled);
+ }
+ }
+
protected void handleAdd() {
- ICFileTypeAssociation assoc = null;
+ CFileTypeAssociation assoc = null;
CFileTypeDialog dlg = new CFileTypeDialog(fBtnNew.getParent().getShell());
if (Window.OK == dlg.open()) {
- assoc = getResolverModel().createAssocation(dlg.getPattern(), dlg.getType());
+ assoc = createAssociation(dlg.getPattern(), dlg.getContentType());
if (null != assoc) {
fAssocViewer.add(assoc);
fAddAssoc.add(assoc);
@@ -349,7 +500,7 @@ public class CFileTypesPreferenceBlock {
IStructuredSelection sel = getSelection();
if ((null != sel) && (!sel.isEmpty())) {
for (Iterator iter = sel.iterator(); iter.hasNext();) {
- ICFileTypeAssociation assoc = (ICFileTypeAssociation) iter.next();
+ CFileTypeAssociation assoc = (CFileTypeAssociation) iter.next();
fAssocViewer.remove(assoc);
fAddAssoc.remove(assoc);
fRemoveAssoc.add(assoc);
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java
index c76b300e9e0..4d8e8f4e291 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java
@@ -16,10 +16,6 @@ import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileTypeAssociation;
-import org.eclipse.cdt.core.filetype.ICFileTypeResolver;
-import org.eclipse.cdt.core.filetype.IResolverModel;
-import org.eclipse.cdt.core.internal.filetype.WorkspaceResolver;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.runtime.Preferences;
@@ -40,11 +36,11 @@ import org.eclipse.ui.PlatformUI;
public class CFileTypesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
private CFileTypesPreferenceBlock fPrefsBlock;
- private ICFileTypeResolver fResolver;
public CFileTypesPreferencePage() {
setDescription(PreferencesMessages.getString("CFileTypesPreferencePage.description")); //$NON-NLS-1$
- setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
+ //setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
+ noDefaultAndApplyButton();
}
/* (non-Javadoc)
@@ -56,8 +52,9 @@ public class CFileTypesPreferencePage extends PreferencePage implements IWorkben
topPane.setLayout(new GridLayout());
topPane.setLayoutData(new GridData(GridData.FILL_BOTH));
- fResolver = getResolverModel().getResolver();
- fPrefsBlock = new CFileTypesPreferenceBlock(fResolver);
+ //fResolver = getResolverModel().getResolver();
+// fPrefsBlock = new CFileTypesPreferenceBlock(fResolver);
+ fPrefsBlock = new CFileTypesPreferenceBlock(null);
PlatformUI.getWorkbench().getHelpSystem().setHelp( topPane, ICHelpContextIds.FILE_TYPES_PREF_PAGE );
return fPrefsBlock.createControl(topPane);
@@ -73,11 +70,10 @@ public class CFileTypesPreferencePage extends PreferencePage implements IWorkben
* @see org.eclipse.jface.preference.PreferencePage#performDefaults()
*/
protected void performDefaults() {
- Preferences prefs = CCorePlugin.getDefault().getPluginPreferences();
- prefs.setToDefault(WorkspaceResolver.PREFS_ASSOCIATIONS_EXCLUSION);
- prefs.setToDefault(WorkspaceResolver.PREFS_ASSOCIATIONS_INCLUSION);
- fPrefsBlock.setResolver(getResolverModel().getResolver());
-
+// Preferences prefs = CCorePlugin.getDefault().getPluginPreferences();
+// prefs.setToDefault(WorkspaceResolver.PREFS_ASSOCIATIONS_EXCLUSION);
+// prefs.setToDefault(WorkspaceResolver.PREFS_ASSOCIATIONS_INCLUSION);
+// fPrefsBlock.setResolver(getResolverModel().getResolver());
super.performDefaults();
}
@@ -87,36 +83,36 @@ public class CFileTypesPreferencePage extends PreferencePage implements IWorkben
public boolean performOk() {
if (fPrefsBlock.performOk()) {
- ICFileTypeAssociation[] oldAssocs = fResolver.getFileTypeAssociations();
-
- ICFileTypeResolver workingCopy = fPrefsBlock.getResolverWorkingCopy();
- ICFileTypeAssociation[] newAssocs = workingCopy.getFileTypeAssociations();
-
- // compare
- List delList = new ArrayList();
- List addList = new ArrayList();
-
- for (int i = 0; i < oldAssocs.length; i++) {
- if (Arrays.binarySearch(newAssocs, oldAssocs[i], ICFileTypeAssociation.Comparator) < 0) {
- delList.add(oldAssocs[i]);
- }
- }
-
- for (int i = 0; i < newAssocs.length; i++) {
- if (Arrays.binarySearch(oldAssocs, newAssocs[i], ICFileTypeAssociation.Comparator) < 0) {
- addList.add(newAssocs[i]);
- }
- }
-
- ICFileTypeAssociation[] addAssocs = (ICFileTypeAssociation[]) addList.toArray(new ICFileTypeAssociation[addList.size()]);
- ICFileTypeAssociation[] delAssocs = (ICFileTypeAssociation[]) delList.toArray(new ICFileTypeAssociation[delList.size()]);
- fResolver.adjustAssociations(addAssocs, delAssocs);
+// ICFileTypeAssociation[] oldAssocs = fResolver.getFileTypeAssociations();
+//
+// ICFileTypeResolver workingCopy = fPrefsBlock.getResolverWorkingCopy();
+// ICFileTypeAssociation[] newAssocs = workingCopy.getFileTypeAssociations();
+//
+// // compare
+// List delList = new ArrayList();
+// List addList = new ArrayList();
+//
+// for (int i = 0; i < oldAssocs.length; i++) {
+// if (Arrays.binarySearch(newAssocs, oldAssocs[i], ICFileTypeAssociation.Comparator) < 0) {
+// delList.add(oldAssocs[i]);
+// }
+// }
+//
+// for (int i = 0; i < newAssocs.length; i++) {
+// if (Arrays.binarySearch(oldAssocs, newAssocs[i], ICFileTypeAssociation.Comparator) < 0) {
+// addList.add(newAssocs[i]);
+// }
+// }
+//
+// ICFileTypeAssociation[] addAssocs = (ICFileTypeAssociation[]) addList.toArray(new ICFileTypeAssociation[addList.size()]);
+// ICFileTypeAssociation[] delAssocs = (ICFileTypeAssociation[]) delList.toArray(new ICFileTypeAssociation[delList.size()]);
+// fResolver.adjustAssociations(addAssocs, delAssocs);
}
return super.performOk();
}
- private IResolverModel getResolverModel() {
- return CCorePlugin.getDefault().getResolverModel();
- }
+// private IResolverModel getResolverModel() {
+// return CCorePlugin.getDefault().getResolverModel();
+// }
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java
index 6a33e1befdd..e6c0f950dc4 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java
@@ -11,11 +11,22 @@
package org.eclipse.cdt.internal.ui.preferences;
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileTypeResolver;
-import org.eclipse.cdt.core.filetype.IResolverModel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.cdt.internal.core.model.CModelManager;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.core.runtime.content.IContentTypeSettings;
+import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
@@ -26,20 +37,128 @@ import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PropertyPage;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
/*
* The preference page used for displaying/editing CDT file
* type associations for a project
*/
public class CFileTypesPropertyPage extends PropertyPage {
+
+ /**
+ * FIXME: This class should be remove when PR #99060
+ * Since ContentTypeSettings.removeFileSpec() is buggy.
+ */
+ class FixCFileTypesPreferenceBlock extends CFileTypesPreferenceBlock {
+
+ public FixCFileTypesPreferenceBlock() {
+ super();
+ }
+
+ public FixCFileTypesPreferenceBlock(IProject input) {
+ super(input);
+ }
+
+ String toListString(Object[] list, String separator) {
+ if (list == null || list.length == 0) {
+ return null;
+ }
+
+ StringBuffer result = new StringBuffer();
+ for (int i = 0; i < list.length; i++) {
+ if (i != 0) {
+ result.append(separator);
+ }
+ result.append(list[i]);
+ }
+ // ignore last comma
+ return result.toString();
+ }
+
+ List parseItemsIntoList(String string, String separator) {
+ ArrayList list = new ArrayList();
+ if (string != null) {
+ String[] items = string.split(separator);
+ list.addAll(Arrays.asList(items));
+ }
+ return list;
+ }
+
+ String getPreferenceKey(int type) {
+ if ((type & IContentType.FILE_EXTENSION_SPEC) != 0)
+ return PREF_FILE_EXTENSIONS;
+ if ((type & IContentType.FILE_NAME_SPEC) != 0)
+ return PREF_FILE_NAMES;
+ throw new IllegalArgumentException("Unknown type: "); //$NON-NLS-1$
+ }
+
+ private IContentTypeManager.ContentTypeChangeEvent newContentTypeChangeEvent(IContentType source, IScopeContext context) {
+ return new IContentTypeManager.ContentTypeChangeEvent(source, context);
+ }
- private Button fUseWorkspace;
- private Button fUseProject;
- protected ICFileTypeResolver fResolver;
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.preferences.CFileTypesPreferenceBlock#addAssociation(org.eclipse.core.runtime.preferences.IScopeContext, org.eclipse.core.runtime.content.IContentType, java.lang.String, int)
+ */
+ protected void addAssociation(IScopeContext context, IContentType contentType, String spec, int type) {
+ super.addAssociation(context, contentType, spec, type);
+ // We do not call flush here it will be call in the perform OK.
+ //contentTypeNode.flush();
+ CModelManager.getDefault().contentTypeChanged(newContentTypeChangeEvent(contentType, context));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.internal.ui.preferences.CFileTypesPreferenceBlock#removeAssociation(org.eclipse.core.runtime.preferences.IScopeContext, org.eclipse.core.runtime.content.IContentType, java.lang.String, int)
+ */
+ protected void removeAssociation(IScopeContext context, IContentType contentType, String spec, int type) {
+ String contentTypeId = contentType.getId();
+
+ Preferences contentTypeNode = context.getNode(FULLPATH_CONTENT_TYPE_PREF_NODE).node(contentTypeId);
+ String key = getPreferenceKey(type);
+ String existing = contentTypeNode.get(key, null);
+ if (existing == null)
+ // content type has no settings - nothing to do
+ return;
+ List existingValues = parseItemsIntoList(contentTypeNode.get(key, null), PREF_SEPARATOR); //$NON-NLS-1$
+ int index = -1;
+ for (int j = 0; j < existingValues.size(); j++)
+ if (((String) existingValues.get(j)).equalsIgnoreCase(spec))
+ index = j;
+ if (index == -1)
+ // did not find the file spec to be removed - nothing to do
+ return;
+ existingValues.remove(index);
+ // set new preference value
+ String newValue = toListString(existingValues.toArray(), PREF_SEPARATOR);
+ if (newValue == null) {
+ contentTypeNode.remove(key);
+ } else {
+ contentTypeNode.put(key, newValue);
+ }
+ // We do not call flush here it will be call in the perform OK.
+ //contentTypeNode.flush();
+ CModelManager.getDefault().contentTypeChanged(newContentTypeChangeEvent(contentType, context));
+ }
+
+ }
+
+ private static final String CONTENT_TYPE_PREF_NODE = "content-types"; //$NON-NLS-1$
+ private static final String FULLPATH_CONTENT_TYPE_PREF_NODE = Platform.PI_RUNTIME + IPath.SEPARATOR + CONTENT_TYPE_PREF_NODE;
+ private static final String PREF_LOCAL_CONTENT_TYPE_SETTINGS = "enabled"; //$NON-NLS-1$
+ private final static String PREF_FILE_EXTENSIONS = "file-extensions"; //$NON-NLS-1$
+ private final static String PREF_FILE_NAMES = "file-names"; //$NON-NLS-1$
+ private final static String PREF_SEPARATOR = ","; //$NON-NLS-1$
+ private static final Preferences PROJECT_SCOPE = Platform.getPreferencesService().getRootNode().node(ProjectScope.SCOPE);
+ //private static final InstanceScope INSTANCE_SCOPE = new InstanceScope();
+
+
+ protected Button fUseWorkspace;
+ protected Button fUseProject;
protected CFileTypesPreferenceBlock fPrefsBlock;
public CFileTypesPropertyPage(){
super();
+ noDefaultAndApplyButton();
}
/* (non-Javadoc)
@@ -62,33 +181,41 @@ public class CFileTypesPropertyPage extends PropertyPage {
fUseWorkspace.setText(PreferencesMessages.getString("CFileTypesPropertyPage.useWorkspaceSettings")); //$NON-NLS-1$
fUseWorkspace.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
- fPrefsBlock.setResolver(getResolverModel().getResolver());
- fPrefsBlock.setEnabled(false);
+ if (fUseWorkspace.getSelection()) {
+ fPrefsBlock.setInput(null);
+ fPrefsBlock.setEnabled(false);
+ }
}
});
+ final IProject project = getProject();
+ boolean custom = isProjectSpecificContentType(project.getName());
+
fUseProject = new Button(radioPane, SWT.RADIO);
fUseProject.setText(PreferencesMessages.getString("CFileTypesPropertyPage.useProjectSettings")); //$NON-NLS-1$
fUseProject.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event e) {
- fPrefsBlock.setResolver(fResolver);
- fPrefsBlock.setEnabled(true);
+ if (fUseProject.getSelection()) {
+ if (isProjectSpecificContentType(project.getName())) {
+ fPrefsBlock.setInput(project);
+ } else {
+ fPrefsBlock.setInputWithCopy(project);
+ }
+ fPrefsBlock.setEnabled(true);
+ }
}
});
- // Resolver block
-
- IProject project = getProject();
- IResolverModel model = getResolverModel();
- fResolver = model.getResolver(project);
- boolean custom = model.hasCustomResolver(project);
-
Composite blockPane = new Composite(topPane, SWT.NONE);
blockPane.setLayout(new GridLayout());
blockPane.setLayoutData(new GridData(GridData.FILL_BOTH));
- fPrefsBlock = new CFileTypesPreferenceBlock(fResolver);
+ if (custom) {
+ fPrefsBlock = new FixCFileTypesPreferenceBlock(project);
+ } else {
+ fPrefsBlock = new FixCFileTypesPreferenceBlock();
+ }
fPrefsBlock.createControl(blockPane);
@@ -106,7 +233,7 @@ public class CFileTypesPropertyPage extends PropertyPage {
protected void performDefaults() {
fUseWorkspace.setSelection(true);
fUseProject.setSelection(false);
- fPrefsBlock.setResolver(getResolverModel().getResolver());
+ fPrefsBlock.setInput(null);
fPrefsBlock.setEnabled(false);
super.performDefaults();
}
@@ -118,16 +245,34 @@ public class CFileTypesPropertyPage extends PropertyPage {
if (fUseProject.getSelection()) {
IProject project = getProject();
- IResolverModel model = getResolverModel();
- ICFileTypeResolver workingCopy = fPrefsBlock.getResolverWorkingCopy();
- if (fPrefsBlock.performOk()) {
- model.createCustomResolver(project, workingCopy);
+ ProjectScope projectScope = new ProjectScope(project);
+ Preferences contentTypePrefs = projectScope.getNode(FULLPATH_CONTENT_TYPE_PREF_NODE);
+ if (! isProjectSpecificContentType(project.getName())) {
+ // enable project-specific settings for this project
+ contentTypePrefs.putBoolean(PREF_LOCAL_CONTENT_TYPE_SETTINGS, true);
+
+ // Copy the InstanceScope information to the projectScope
+ copyInstanceToProjectScope(project);
+ }
+ fPrefsBlock.performOk();
+ try {
+ contentTypePrefs.flush();
+ } catch (BackingStoreException e) {
+ // ignore ??
}
} else if (fUseWorkspace.getSelection()) {
IProject project = getProject();
- IResolverModel model = getResolverModel();
- if (model.hasCustomResolver(project)) {
- model.removeCustomResolver(project);
+ if (isProjectSpecificContentType(project.getName())) {
+// ProjectScope projectScope = new ProjectScope(project);
+// Preferences contentTypePrefs = projectScope.getNode(FULLPATN_CONTENT_TYPE_PREF_NODE);
+// // enable project-specific settings for this project
+// contentTypePrefs.putBoolean(PREF_LOCAL_CONTENT_TYPE_SETTINGS, false);
+// try {
+// contentTypePrefs.flush();
+// } catch (BackingStoreException e) {
+// // ignore ??
+// }
+ clearSpecs(project);
}
}
return super.performOk();
@@ -137,15 +282,124 @@ public class CFileTypesPropertyPage extends PropertyPage {
Object element = getElement();
IProject project = null;
- if ((null != element) && (element instanceof IProject)) {
+ if (element instanceof IProject) {
project = (IProject) element;
+ } else if (element instanceof IAdaptable) {
+ project= (IProject) ((IAdaptable)element).getAdapter(IProject.class);
}
-
return project;
}
- protected IResolverModel getResolverModel() {
- return CCorePlugin.getDefault().getResolverModel();
+ protected static boolean isProjectSpecificContentType(String projectName) {
+ try {
+ // be careful looking up for our node so not to create any nodes as side effect
+ Preferences node = PROJECT_SCOPE;
+ //TODO once bug 90500 is fixed, should be simpler
+ // for now, take the long way
+ if (!node.nodeExists(projectName))
+ return false;
+ node = node.node(projectName);
+ if (!node.nodeExists(Platform.PI_RUNTIME))
+ return false;
+ node = node.node(Platform.PI_RUNTIME);
+ if (!node.nodeExists(CONTENT_TYPE_PREF_NODE))
+ return false;
+ node = node.node(CONTENT_TYPE_PREF_NODE);
+ return node.getBoolean(PREF_LOCAL_CONTENT_TYPE_SETTINGS, false);
+ } catch (BackingStoreException e) {
+ // exception treated when retrieving the project preferences
+ }
+ return false;
}
-
+
+ void clearSpecs(IProject project) {
+ IScopeContext projectScope = new ProjectScope(project);
+
+ // Calculate the events to tell the clients of changes
+ IContentTypeManager manager = Platform.getContentTypeManager();
+ IContentType[] ctypes = manager.getAllContentTypes();
+ ArrayList list = new ArrayList(ctypes.length);
+ for (int i = 0; i < ctypes.length; i++) {
+ IContentType ctype = ctypes[i];
+ try {
+ IContentTypeSettings projectSettings = ctype.getSettings(projectScope);
+ String[] globalSpecs = ctypes[i].getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
+ String[] projectSpecs = projectSettings.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
+ if (isSpecsChanged(globalSpecs, projectSpecs)) {
+ list.add(ctype);
+ } else {
+ globalSpecs = ctypes[i].getFileSpecs(IContentType.FILE_NAME_SPEC);
+ projectSpecs = projectSettings.getFileSpecs(IContentType.FILE_NAME_SPEC);
+ if (isSpecsChanged(globalSpecs, projectSpecs)) {
+ list.add(ctype);
+ }
+ }
+ } catch (CoreException e) {
+ // ignore ?
+ }
+ }
+
+ // Delete the "content-type" node.
+ Preferences contentTypePrefs = projectScope.getNode(FULLPATH_CONTENT_TYPE_PREF_NODE);
+ try {
+ Preferences parent = contentTypePrefs.parent();
+ contentTypePrefs.removeNode();
+ parent.flush();
+ } catch (BackingStoreException e) {
+ // ignore ??
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ }
+
+ // fire the events
+ for (int i = 0; i < list.size(); ++i) {
+ IContentType source = (IContentType)list.get(i);
+ IContentTypeManager.ContentTypeChangeEvent event = new IContentTypeManager.ContentTypeChangeEvent(source, projectScope);
+ CModelManager.getDefault().contentTypeChanged(event);
+ }
+ }
+
+ boolean isSpecsChanged(String[] newSpecs, String[] oldSpecs) {
+ if (newSpecs.length != oldSpecs.length) {
+ return true;
+ }
+ for (int i = 0; i < newSpecs.length; ++i) {
+ String newSpec = newSpecs[i];
+ boolean found = false;
+ for (int j = 0; j < oldSpecs.length; ++j) {
+ String oldSpec = oldSpecs[j];
+ if (newSpec.equalsIgnoreCase(oldSpec)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void copyInstanceToProjectScope(IProject project) {
+ IScopeContext projectScope = new ProjectScope(project);
+ IContentTypeManager manager = Platform.getContentTypeManager();
+ IContentType[] globalTypes = manager.getAllContentTypes();
+ for (int i = 0; i < globalTypes.length; i++) {
+ IContentType globalType = globalTypes[i];
+ try {
+ IContentTypeSettings settings = globalType.getSettings(projectScope);
+ String[] specs = globalType.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
+ for (int j = 0; j < specs.length; j++) {
+ settings.addFileSpec(specs[j], IContentType.FILE_EXTENSION_SPEC);
+ }
+ specs = globalType.getFileSpecs(IContentType.FILE_NAME_SPEC);
+ for (int j = 0; j < specs.length; j++) {
+ settings.addFileSpec(specs[j], IContentType.FILE_NAME_SPEC);
+ }
+ } catch (CoreException e) {
+ // ignore ?
+ }
+ }
+ }
+
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties
index 2430dd9bb72..6f14f7ec877 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties
@@ -143,7 +143,9 @@ CFileTypesPreferenceBlock.New...=New...
CFileTypesPreferenceBlock.Remove=Remove
CFileTypesPreferencePage.colTitlePattern=Filename
CFileTypesPreferencePage.colTitleDescription=Description
-CFileTypesPreferencePage.colTitleLanguage=Language
+CFileTypesPreferencePage.colTitleStatus=Status
+CFileTypesPreferencePage.userDefined=User Defined
+CFileTypesPreferencePage.preDefined=Locked
CFileTypesPropertyPage.useWorkspaceSettings=Use workspace settings
CFileTypesPropertyPage.useProjectSettings=Use project settings
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java
index 26ea961237e..2e28edbe05e 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java
@@ -18,8 +18,6 @@ import java.util.LinkedList;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileType;
-import org.eclipse.cdt.core.filetype.ICFileTypeConstants;
import org.eclipse.cdt.core.formatter.CodeFormatter;
import org.eclipse.cdt.core.formatter.CodeFormatterConstants;
import org.eclipse.cdt.core.model.CoreModel;
@@ -134,16 +132,14 @@ public class CFormattingStrategy extends ContextBasedFormattingStrategy {
if(null != activeFile) {
IProject currentProject = activeFile.getProject();
Assert.isNotNull(currentProject);
+ String filename = activeFile.getFullPath().lastSegment();
// pick the language
- if (CoreModel.hasCCNature(currentProject)) {
+ if (CoreModel.isValidCXXHeaderUnitName(currentProject, filename)
+ || CoreModel.isValidCXXSourceUnitName(currentProject, filename)) {
language = ParserLanguage.CPP;
} else {
// for C project try to guess.
- ICFileType type = CCorePlugin.getDefault().getFileType(currentProject,
- activeFile.getFullPath().lastSegment());
- String lid = type.getLanguage().getId();
- if(lid != null && lid.equals(ICFileTypeConstants.LANG_C))
- language = ParserLanguage.C;
+ language = ParserLanguage.C;
}
preferences= new HashMap(CoreModel.getDefault().create(
activeFile.getProject()).getOptions(true));
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java
index 1513934f591..9c3184fe6e0 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java
@@ -15,8 +15,6 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.ASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.filetype.ICFileType;
-import org.eclipse.cdt.core.filetype.ICFileTypeConstants;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.search.BasicSearchMatch;
@@ -37,11 +35,10 @@ public class SearchCompletionContributor implements ICompletionContributor {
IWorkingCopy workingCopy, ASTCompletionNode completionNode,
List proposals)
{
- ICFileType fileType = CCorePlugin.getDefault().getFileType(workingCopy.getCProject().getProject(), workingCopy.getElementName());
// and only for C source files
- if (fileType.isHeader() || ! fileType.getLanguage().getId().equals(ICFileTypeConstants.LANG_C))
- return;
-
+ if (workingCopy.isHeaderUnit() || !workingCopy.isCLanguage()) {
+ return;
+ }
if (completionNode != null) {
IASTName[] names = completionNode.getNames();
for (int i = 0; i < names.length; i++) {