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++) {