diff --git a/core/org.eclipse.cdt.ui/browser/ChangeLog-browser b/core/org.eclipse.cdt.ui/browser/ChangeLog-browser index 17bd7b94483..d129843ca91 100644 --- a/core/org.eclipse.cdt.ui/browser/ChangeLog-browser +++ b/core/org.eclipse.cdt.ui/browser/ChangeLog-browser @@ -1,3 +1,27 @@ +2004-09-15 Chris Wiebe + + fixed element navigation problems + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingElementFilter.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingLabelProvider.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingMessages.properties + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingViewerSorter.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/LexicalSortingAction.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesView.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewLabelProvider.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsView.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsViewContentProvider.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypeInfoSorter.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesView.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java + * browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewLabelProvider.java + * browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/OpenTypeHierarchyUtil.java + * browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/TypeHierarchyViewPart.java + 2004-09-02 Chris Wiebe fix editor/view selection problems diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java index e6fd05b859d..464067c021b 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingContentProvider.java @@ -26,6 +26,15 @@ import org.eclipse.swt.widgets.Display; public abstract class CBrowsingContentProvider extends BaseCElementContentProvider implements ITreeContentProvider, ITypeCacheChangedListener { + public static final Object CONTENT_CANCELLED = new Object(); + public static final Object CONTENT_ERROR = new Object(); + public static final Object CONTENT_EMPTY = new Object(); + + protected static final Object[] ERROR_NO_CHILDREN = new Object[] { CONTENT_ERROR }; + protected static final Object[] ERROR_CANCELLED = new Object[] { CONTENT_CANCELLED }; + protected static final Object[] EMPTY_CHILDREN = NO_CHILDREN; + protected static final Object[] INVALID_INPUT = NO_CHILDREN; + protected StructuredViewer fViewer; protected Object fInput; protected CBrowsingPart fBrowsingPart; diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingElementFilter.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingElementFilter.java new file mode 100644 index 00000000000..922fa2db182 --- /dev/null +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingElementFilter.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2004 QNX Software Systems 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 Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.browser.cbrowsing; + +import org.eclipse.cdt.core.browser.ITypeInfo; +import org.eclipse.cdt.internal.ui.filters.NonCElementFilter; +import org.eclipse.jface.viewers.Viewer; + +public class CBrowsingElementFilter extends NonCElementFilter { + + public boolean select(Viewer viewer, Object parent, Object element) { + if (element instanceof ITypeInfo) + return true; + return super.select(viewer, parent, element); + } +} diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingLabelProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingLabelProvider.java new file mode 100644 index 00000000000..e7c34540ccc --- /dev/null +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingLabelProvider.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2004 QNX Software Systems 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 Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.browser.cbrowsing; + +import org.eclipse.cdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; +import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider; +import org.eclipse.cdt.internal.ui.viewsupport.CElementLabels; +import org.eclipse.swt.graphics.Image; + +class CBrowsingLabelProvider extends AppearanceAwareLabelProvider { + + private static final int TEXTFLAGS = DEFAULT_TEXTFLAGS | CElementLabels.F_APP_TYPE_SIGNATURE; + private static final int IMAGEFLAGS = DEFAULT_IMAGEFLAGS | CElementImageProvider.SMALL_ICONS; + + CBrowsingLabelProvider() { + super(TEXTFLAGS, IMAGEFLAGS); + } + + public Image getImage(Object element) { + if (element == CBrowsingContentProvider.CONTENT_ERROR) { + return null; + } else if (element == CBrowsingContentProvider.CONTENT_CANCELLED) { + return null; + } + return super.getImage(element); + } + + public String getText(Object element) { + if (element == CBrowsingContentProvider.CONTENT_ERROR) { + return CBrowsingMessages.getString("CBrowsingLabelProvider.errorNoItems"); //$NON-NLS-1$ + } else if (element == CBrowsingContentProvider.CONTENT_CANCELLED) { + return CBrowsingMessages.getString("CBrowsingLabelProvider.errorCancelled"); //$NON-NLS-1$ + } + return super.getText(element); + } +} diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingMessages.properties b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingMessages.properties index 15c8a8d1d98..1505e3dc49f 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingMessages.properties +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingMessages.properties @@ -26,3 +26,6 @@ StatusBar.concat= {0}, {1} ClassPathContainer.unbound_label={0} (unbound) ClassPathContainer.unknown_label={0} (unknown) + +CBrowsingLabelProvider.errorNoItems= Unable to retrieve type information +CBrowsingLabelProvider.errorCancelled= Cancelled diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java index e1d71f4d4d5..06d7302a1ea 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingPart.java @@ -20,6 +20,7 @@ import org.eclipse.cdt.core.browser.AllTypesCache; import org.eclipse.cdt.core.browser.ITypeInfo; import org.eclipse.cdt.core.browser.ITypeReference; import org.eclipse.cdt.core.browser.TypeSearchScope; +import org.eclipse.cdt.core.browser.TypeUtil; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; @@ -36,6 +37,7 @@ import org.eclipse.cdt.internal.ui.util.ExceptionHandler; import org.eclipse.cdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; import org.eclipse.cdt.internal.ui.viewsupport.CElementLabels; import org.eclipse.cdt.internal.ui.viewsupport.IViewPartInputProvider; +import org.eclipse.cdt.internal.ui.viewsupport.StatusBarUpdater; import org.eclipse.cdt.internal.ui.workingsets.WorkingSetFilterActionGroup; import org.eclipse.cdt.ui.CElementLabelProvider; import org.eclipse.cdt.ui.CUIPlugin; @@ -61,6 +63,7 @@ import org.eclipse.jface.util.Assert; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.IElementComparer; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelection; @@ -72,6 +75,7 @@ import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; +import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; @@ -303,7 +307,9 @@ public abstract class CBrowsingPart extends ViewPart implements IMenuListener, I fLabelProvider= createLabelProvider(); fViewer.setLabelProvider(fLabelProvider); - fViewer.setSorter(createTypeInfoSorter()); + fViewer.setSorter(createViewerSorter()); + fViewer.setComparer(createElementComparer()); + fViewer.setUseHashlookup(true); fTitleProvider= createTitleProvider(); @@ -380,10 +386,6 @@ public abstract class CBrowsingPart extends ViewPart implements IMenuListener, I // return new DecoratingCLabelProvider(provider); // } - protected TypeInfoSorter createTypeInfoSorter() { - return new TypeInfoSorter(); - } - protected StatusBarUpdater createStatusBarUpdater(IStatusLineManager slManager) { return new StatusBarUpdater(slManager); } @@ -658,8 +660,11 @@ public abstract class CBrowsingPart extends ViewPart implements IMenuListener, I } protected boolean isProjectSourceRoot(ISourceRoot root) { - IResource resource= root.getResource(); - return (resource instanceof IProject); + if (root != null) { + IResource resource = root.getResource(); + return (resource instanceof IProject); + } + return false; } /** @@ -873,6 +878,12 @@ public abstract class CBrowsingPart extends ViewPart implements IMenuListener, I protected abstract LabelProvider createLabelProvider(); + protected abstract ViewerSorter createViewerSorter(); + + protected IElementComparer createElementComparer() { + return new CBrowsingElementComparer(); + } + protected ILabelProvider createTitleProvider() { return new CElementLabelProvider(CElementLabelProvider.SHOW_BASICS | CElementLabelProvider.SHOW_SMALL_ICONS); } @@ -903,7 +914,7 @@ public abstract class CBrowsingPart extends ViewPart implements IMenuListener, I * Adds filters the viewer of this part. */ protected void addFilters() { - // default is to have no filters + // default is to have no filters } // /** @@ -1267,6 +1278,26 @@ public abstract class CBrowsingPart extends ViewPart implements IMenuListener, I // return element.getPrimaryElement(); // } } + + protected ICElement getTypeForTU(ITranslationUnit tu) { + tu = (ITranslationUnit) getSuitableElement(tu); + +// // Use primary type if possible +// IType primaryType= cu.findPrimaryType(); +// if (primaryType != null) +// return primaryType; + + // Use first top-level type + try { + ICElement[] types = TypeUtil.getTypes(tu); + if (types.length > 0) + return types[0]; + else + return null; + } catch (CModelException ex) { + return null; + } + } protected final Object getSingleElementFromSelection(ISelection selection) { if (!(selection instanceof StructuredSelection) || selection.isEmpty()) diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingViewerSorter.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingViewerSorter.java new file mode 100644 index 00000000000..0c2b38e65cd --- /dev/null +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/CBrowsingViewerSorter.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2004 QNX Software Systems 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 Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.browser.cbrowsing; + +import org.eclipse.cdt.ui.CElementSorter; + +public class CBrowsingViewerSorter extends CElementSorter { + + public CBrowsingViewerSorter() { + super(); + } +} diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/FilterUpdater.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/FilterUpdater.java deleted file mode 100644 index ebbc18dcec8..00000000000 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/FilterUpdater.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.internal.ui.browser.cbrowsing; - -import org.eclipse.swt.widgets.Control; - -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.viewers.StructuredViewer; - -import org.eclipse.core.resources.IResourceChangeEvent; -import org.eclipse.core.resources.IResourceChangeListener; -import org.eclipse.core.resources.IResourceDelta; - - -public class FilterUpdater implements IResourceChangeListener { - - private StructuredViewer fViewer; - - public FilterUpdater(StructuredViewer viewer) { - Assert.isNotNull(viewer); - fViewer= viewer; - } - - /* (non-Javadoc) - * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) - */ - public void resourceChanged(IResourceChangeEvent event) { - IResourceDelta delta= event.getDelta(); - if (delta == null) - return; - - IResourceDelta[] projDeltas = delta.getAffectedChildren(IResourceDelta.CHANGED); - for (int i= 0; i < projDeltas.length; i++) { - IResourceDelta pDelta= projDeltas[i]; - if ((pDelta.getFlags() & IResourceDelta.DESCRIPTION) != 0) { - final Control ctrl= fViewer.getControl(); - if (ctrl != null && !ctrl.isDisposed()) { - // async is needed due to bug 33783 - ctrl.getDisplay().asyncExec(new Runnable() { - public void run() { - if (!ctrl.isDisposed()) - fViewer.refresh(false); - } - }); - } - } - } - } -} diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/LexicalSortingAction.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/LexicalSortingAction.java index a3f0c89304a..7d357d4e401 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/LexicalSortingAction.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/LexicalSortingAction.java @@ -23,7 +23,7 @@ import org.eclipse.ui.help.WorkbenchHelp; * which should be renamed to MemberActionsGroup */ public class LexicalSortingAction extends Action { - private TypeInfoSorter fSorter= new TypeInfoSorter(); + private CBrowsingViewerSorter fSorter= new CBrowsingViewerSorter(); private StructuredViewer fViewer; private String fPreferenceKey; diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java index a6efe9d4342..d0884f3278e 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersView.java @@ -16,11 +16,10 @@ import org.eclipse.cdt.core.browser.TypeUtil; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICModel; import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.INamespace; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.ui.ICHelpContextIds; -import org.eclipse.cdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; -import org.eclipse.cdt.internal.ui.viewsupport.CElementLabels; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.jface.action.IToolBarManager; @@ -33,6 +32,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorPart; @@ -72,10 +72,7 @@ public class MembersView extends CBrowsingPart implements IPropertyChangeListene * @see org.eclipse.jface.viewers.ILabelProvider */ protected LabelProvider createLabelProvider() { - return new AppearanceAwareLabelProvider( - AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | CElementLabels.F_APP_TYPE_SIGNATURE, - AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS - ); + return new CBrowsingLabelProvider(); } /** @@ -101,6 +98,18 @@ public class MembersView extends CBrowsingPart implements IPropertyChangeListene // fMemberFilterActionGroup= new MemberFilterActionGroup(viewer, JavaUI.ID_MEMBERS_VIEW); return viewer; } + + protected ViewerSorter createViewerSorter() { + return new CBrowsingViewerSorter(); + } + + /** + * Adds filters the viewer of this part. + */ + protected void addFilters() { + super.addFilters(); + getViewer().addFilter(new CBrowsingElementFilter()); + } protected void fillToolBar(IToolBarManager tbm) { tbm.add(new LexicalSortingAction(getViewer(), CUIPlugin.ID_MEMBERS_VIEW)); @@ -215,9 +224,6 @@ public class MembersView extends CBrowsingPart implements IPropertyChangeListene return new MembersViewContentProvider(this); } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.ui.browser.cbrowsing.CBrowsingPart#findInputForElement(java.lang.Object) - */ protected Object findInputForElement(Object element) { if (element instanceof ICModel || element instanceof ICProject || element instanceof ISourceRoot) { return null; @@ -227,19 +233,28 @@ public class MembersView extends CBrowsingPart implements IPropertyChangeListene return element; } - if (element instanceof ICElement && !(element instanceof ITranslationUnit)) { - ICElement parent = TypeUtil.getDeclaringContainerType((ICElement)element); - if (parent != null) { - ITypeInfo info = AllTypesCache.getTypeForElement(parent, true, true, null); - if (info != null) - return info; + if (element instanceof ICElement) { + ICElement celem = (ICElement)element; + if (!celem.exists()) + return null; + + if (TypeUtil.isDeclaringType(celem)) { + ICElement type= TypeUtil.getDeclaringType(celem); + if (type == null || type instanceof INamespace) + return AllTypesCache.getTypeForElement(celem, true, true, null); + else + return findInputForElement(type); + } else if (TypeUtil.isMemberType(celem)) { + return findInputForElement(TypeUtil.getDeclaringType(celem)); + } else { + ITranslationUnit tu = TypeUtil.getTranslationUnit(celem); + if (tu != null) + return getTypeForTU(tu); } - return null; } - - return null; + return null; } - + /* (non-Javadoc) * @see org.eclipse.cdt.internal.ui.browser.cbrowsing.CBrowsingPart#findElementToSelect(java.lang.Object) */ diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java index f786dd6120b..4e12580e4a6 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/MembersViewContentProvider.java @@ -10,16 +10,17 @@ *******************************************************************************/ package org.eclipse.cdt.internal.ui.browser.cbrowsing; -import java.util.Iterator; - import org.eclipse.cdt.core.browser.AllTypesCache; import org.eclipse.cdt.core.browser.ITypeInfo; +import org.eclipse.cdt.core.browser.TypeUtil; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICModel; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.INamespace; import org.eclipse.cdt.core.model.IParent; +import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.cdt.ui.CUIPlugin; -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Shell; class MembersViewContentProvider extends CBrowsingContentProvider { @@ -61,48 +62,43 @@ class MembersViewContentProvider extends CBrowsingContentProvider { */ public Object[] getChildren(Object element) { if (element == null || (element instanceof ICElement && !((ICElement)element).exists())) { - return NO_CHILDREN; + return INVALID_INPUT; } try { startReadInDisplayThread(); - if (element instanceof IStructuredSelection) { - Assert.isLegal(false); - Object[] result= new Object[0]; - Class clazz= null; - Iterator iter= ((IStructuredSelection)element).iterator(); - while (iter.hasNext()) { - Object item= iter.next(); - if (clazz == null) - clazz= item.getClass(); - if (clazz == item.getClass()) - result= concatenate(result, getChildren(item)); - else - return NO_CHILDREN; - } - return result; - } - if (element instanceof ITypeInfo) { ITypeInfo info = (ITypeInfo) element; if (info.getCElementType() == ICElement.C_NAMESPACE) { - return NO_CHILDREN; // shouldn't get here... + return INVALID_INPUT; // shouldn't get here... + } + if (info.getCElementType() == ICElement.C_TYPEDEF) { + return EMPTY_CHILDREN; } ICElement elem = AllTypesCache.getElementForType(info, true, true, null); - if (elem != null && elem instanceof IParent) { - return ((IParent)elem).getChildren(); + if (elem == null) { + return ERROR_NO_CHILDREN; + } else { + if (elem instanceof IParent) { + ICElement[] children = ((IParent)elem).getChildren(); + if (children != null && children.length > 0) + return children; + } + return EMPTY_CHILDREN; } - return NO_CHILDREN; } if (element instanceof IParent) { - return ((IParent)element).getChildren(); + ICElement[] children = ((IParent)element).getChildren(); + if (children != null && children.length > 0) + return children; + return EMPTY_CHILDREN; } - - return NO_CHILDREN; + + return INVALID_INPUT; } catch (CModelException e) { - return NO_CHILDREN; + return ERROR_CANCELLED; } finally { finishedReadInDisplayThread(); } @@ -112,8 +108,7 @@ class MembersViewContentProvider extends CBrowsingContentProvider { * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ public Object getParent(Object element) { - return fInput; -/* if (element instanceof ICModel || element instanceof ICProject || element instanceof ISourceRoot) { + if (element instanceof ICModel || element instanceof ICProject || element instanceof ISourceRoot) { return null; } @@ -125,18 +120,25 @@ class MembersViewContentProvider extends CBrowsingContentProvider { startReadInDisplayThread(); if (element instanceof ICElement) { - ICElement parent = ((ICElement)element).getParent(); - if (parent != null) - return AllTypesCache.getTypeForElement(parent, true, true, null); + ICElement celem = (ICElement)element; + if (TypeUtil.isMemberType(celem)) { + ICElement parent = TypeUtil.getDeclaringType(celem); + if (parent == null || parent instanceof INamespace) { + ITypeInfo info = AllTypesCache.getTypeForElement(celem, true, true, null); + if (info != null) + return info.getEnclosingType(); + } + return parent; + } } - + return null; // } catch (CModelException e) { // return false; } finally { finishedReadInDisplayThread(); } -*/ } + } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesView.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesView.java index d39bc04865c..f31d13a8bdf 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesView.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesView.java @@ -23,11 +23,11 @@ import org.eclipse.cdt.core.model.ITypeDef; import org.eclipse.cdt.internal.ui.ICHelpContextIds; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; -import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoLabelProvider; import org.eclipse.core.resources.IProject; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredViewer; +import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IActionBars; @@ -45,7 +45,7 @@ public class NamespacesView extends CBrowsingPart { * @see org.eclipse.jface.viewers.ILabelProvider */ protected LabelProvider createLabelProvider() { - return new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_FULLY_QUALIFIED); + return new NamespacesViewLabelProvider(); } /** @@ -91,14 +91,16 @@ public class NamespacesView extends CBrowsingPart { return new NamespacesViewContentProvider(this); } - + protected ViewerSorter createViewerSorter() { + return new TypeInfoSorter(); + } /** * Adds filters the viewer of this part. */ protected void addFilters() { super.addFilters(); -// getViewer().addFilter(new NonCElementFilter()); + getViewer().addFilter(new CBrowsingElementFilter()); } /** diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java index f938ea3ced7..f40e8559e63 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewContentProvider.java @@ -11,7 +11,6 @@ package org.eclipse.cdt.internal.ui.browser.cbrowsing; import java.lang.reflect.InvocationTargetException; -import java.util.Iterator; import org.eclipse.cdt.core.browser.AllTypesCache; import org.eclipse.cdt.core.browser.ITypeInfo; @@ -25,8 +24,6 @@ import org.eclipse.cdt.internal.ui.util.ExceptionHandler; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.IProgressService; @@ -75,29 +72,12 @@ class NamespacesViewContentProvider extends CBrowsingContentProvider { */ public Object[] getChildren(Object element) { if (element == null || (element instanceof ICElement && !((ICElement)element).exists())) { - return NO_CHILDREN; + return INVALID_INPUT; } try { startReadInDisplayThread(); - if (element instanceof IStructuredSelection) { - Assert.isLegal(false); - Object[] result= new Object[0]; - Class clazz= null; - Iterator iter= ((IStructuredSelection)element).iterator(); - while (iter.hasNext()) { - Object item= iter.next(); - if (clazz == null) - clazz= item.getClass(); - if (clazz == item.getClass()) - result= concatenate(result, getChildren(item)); - else - return NO_CHILDREN; - } - return result; - } - if (element instanceof ICProject) { TypeSearchScope scope = new TypeSearchScope(); scope.add((ICProject)element); @@ -110,7 +90,7 @@ class NamespacesViewContentProvider extends CBrowsingContentProvider { return getNamespaces(scope); } - return NO_CHILDREN; + return INVALID_INPUT; // } catch (CModelException e) { // return NO_CHILDREN; } finally { @@ -172,13 +152,17 @@ class NamespacesViewContentProvider extends CBrowsingContentProvider { String title = OpenTypeMessages.getString("OpenTypeAction.exception.title"); //$NON-NLS-1$ String message = OpenTypeMessages.getString("OpenTypeAction.exception.message"); //$NON-NLS-1$ ExceptionHandler.handle(e, title, message); - return NO_CHILDREN; + return ERROR_CANCELLED; } catch (InterruptedException e) { // cancelled by user - return NO_CHILDREN; + return ERROR_CANCELLED; } } - return AllTypesCache.getNamespaces(scope, true); + ITypeInfo[] namespaces = AllTypesCache.getNamespaces(scope, true); + if (namespaces != null && namespaces.length > 0) { + return namespaces; + } + return EMPTY_CHILDREN; } protected Shell getShell() { diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewLabelProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewLabelProvider.java new file mode 100644 index 00000000000..6548025d340 --- /dev/null +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/NamespacesViewLabelProvider.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2004 QNX Software Systems 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 Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.browser.cbrowsing; + +import org.eclipse.cdt.core.browser.ITypeInfo; +import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoLabelProvider; +import org.eclipse.swt.graphics.Image; + +public class NamespacesViewLabelProvider extends CBrowsingLabelProvider { + + protected static final TypeInfoLabelProvider fTypeInfoLabelProvider = new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_FULLY_QUALIFIED); + + public NamespacesViewLabelProvider() { + super(); + } + + public Image getImage(Object element) { + if (element instanceof ITypeInfo) + return fTypeInfoLabelProvider.getImage(element); + return super.getImage(element); + } + + public String getText(Object element) { + if (element instanceof ITypeInfo) + return fTypeInfoLabelProvider.getText(element); + return super.getText(element); + } +} diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsView.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsView.java index 9c8e7d31505..2f8b101926c 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsView.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsView.java @@ -23,8 +23,6 @@ import org.eclipse.cdt.core.model.IStructure; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITypeDef; import org.eclipse.cdt.internal.ui.ICHelpContextIds; -import org.eclipse.cdt.internal.ui.viewsupport.AppearanceAwareLabelProvider; -import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; import org.eclipse.jface.viewers.DoubleClickEvent; @@ -34,6 +32,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IPageLayout; @@ -56,9 +55,19 @@ public class ProjectsView extends CBrowsingPart { } protected LabelProvider createLabelProvider() { - return new AppearanceAwareLabelProvider( - AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS, - AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS | CElementImageProvider.SMALL_ICONS ); + return new CBrowsingLabelProvider(); + } + + protected ViewerSorter createViewerSorter() { + return new CBrowsingViewerSorter(); + } + + /** + * Adds filters the viewer of this part. + */ + protected void addFilters() { + super.addFilters(); + getViewer().addFilter(new CBrowsingElementFilter()); } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsViewContentProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsViewContentProvider.java index 689ead0665c..5e152ababb0 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsViewContentProvider.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/ProjectsViewContentProvider.java @@ -11,7 +11,6 @@ package org.eclipse.cdt.internal.ui.browser.cbrowsing; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.eclipse.cdt.core.model.CModelException; @@ -21,8 +20,6 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.viewers.IStructuredSelection; class ProjectsViewContentProvider extends CBrowsingContentProvider { @@ -70,29 +67,12 @@ class ProjectsViewContentProvider extends CBrowsingContentProvider { */ public Object[] getChildren(Object element) { if (element == null || (element instanceof ICElement && !((ICElement)element).exists())) { - return NO_CHILDREN; + return INVALID_INPUT; } try { startReadInDisplayThread(); - if (element instanceof IStructuredSelection) { - Assert.isLegal(false); - Object[] result= new Object[0]; - Class clazz= null; - Iterator iter= ((IStructuredSelection)element).iterator(); - while (iter.hasNext()) { - Object item= iter.next(); - if (clazz == null) - clazz= item.getClass(); - if (clazz == item.getClass()) - result= concatenate(result, getChildren(item)); - else - return NO_CHILDREN; - } - return result; - } - if (element instanceof ICModel) { ICModel cModel = (ICModel)element; return cModel.getCProjects(); @@ -104,9 +84,9 @@ class ProjectsViewContentProvider extends CBrowsingContentProvider { if (element instanceof ISourceRoot) return NO_CHILDREN; - return NO_CHILDREN; + return INVALID_INPUT; } catch (CModelException e) { - return NO_CHILDREN; + return ERROR_CANCELLED; } finally { finishedReadInDisplayThread(); } diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/StatusBarUpdater.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/StatusBarUpdater.java deleted file mode 100644 index dfd667472ad..00000000000 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/StatusBarUpdater.java +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.internal.ui.browser.cbrowsing; - - -import org.eclipse.cdt.core.browser.ITypeInfo; -import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.internal.ui.CUIMessages; -import org.eclipse.cdt.internal.ui.viewsupport.CElementLabels; -import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoLabelProvider; -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IResource; - -import org.eclipse.jface.action.IStatusLineManager; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; - -/** - * Add the StatusBarUpdater to your ViewPart to have the statusbar - * describing the selected elements. - */ -public class StatusBarUpdater implements ISelectionChangedListener { - - private final int LABEL_FLAGS= CElementLabels.DEFAULT_QUALIFIED | CElementLabels.ROOT_POST_QUALIFIED | CElementLabels.APPEND_ROOT_PATH | - CElementLabels.M_PARAMETER_TYPES | CElementLabels.M_PARAMETER_NAMES | CElementLabels.M_APP_RETURNTYPE | CElementLabels.M_EXCEPTIONS | - CElementLabels.F_APP_TYPE_SIGNATURE; - - private final TypeInfoLabelProvider fTypeInfoLabelProvider = new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_FULLY_QUALIFIED + TypeInfoLabelProvider.SHOW_PATH); - - private IStatusLineManager fStatusLineManager; - - public StatusBarUpdater(IStatusLineManager statusLineManager) { - fStatusLineManager= statusLineManager; - } - - /* - * @see ISelectionChangedListener#selectionChanged - */ - public void selectionChanged(SelectionChangedEvent event) { - String statusBarMessage= formatMessage(event.getSelection()); - fStatusLineManager.setMessage(statusBarMessage); - } - - - protected String formatMessage(ISelection sel) { - if (sel instanceof IStructuredSelection && !sel.isEmpty()) { - IStructuredSelection selection= (IStructuredSelection) sel; - - int nElements= selection.size(); - if (nElements > 1) { - return CUIMessages.getFormattedString("StatusBarUpdater.num_elements_selected", String.valueOf(nElements)); //$NON-NLS-1$ - } else { - Object elem= selection.getFirstElement(); - if (elem instanceof ICElement) { - return formatCElementMessage((ICElement) elem); - } else if (elem instanceof ITypeInfo) { - return formatTypeInfoMessage((ITypeInfo) elem); - } else if (elem instanceof IResource) { - return formatResourceMessage((IResource) elem); - } - } - } - return ""; //$NON-NLS-1$ - } - - private String formatCElementMessage(ICElement element) { - return CElementLabels.getElementLabel(element, LABEL_FLAGS); - } - - private String formatTypeInfoMessage(ITypeInfo info) { - return fTypeInfoLabelProvider.getText(info); - } - - private String formatResourceMessage(IResource element) { - IContainer parent= element.getParent(); - if (parent != null && parent.getType() != IResource.ROOT) - return element.getName() + CElementLabels.CONCAT_STRING + parent.getFullPath().makeRelative().toString(); - else - return element.getName(); - } - -} diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/StorageLabelProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/StorageLabelProvider.java deleted file mode 100644 index f11a3fbd929..00000000000 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/StorageLabelProvider.java +++ /dev/null @@ -1,129 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2004 IBM Corporation 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.internal.ui.browser.cbrowsing; - - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.eclipse.core.resources.IStorage; -import org.eclipse.core.runtime.IPath; - -import org.eclipse.swt.graphics.Image; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.LabelProvider; - -import org.eclipse.ui.IEditorRegistry; -import org.eclipse.ui.IFileEditorMapping; -import org.eclipse.ui.PlatformUI; - -/** - * Standard label provider for IStorage objects. - * Use this class when you want to present IStorage objects in a viewer. - */ -public class StorageLabelProvider extends LabelProvider { - - private IEditorRegistry fEditorRegistry= PlatformUI.getWorkbench().getEditorRegistry(); - private Map fJarImageMap= new HashMap(10); - private Image fDefaultImage; - - /* (non-Javadoc) - * @see ILabelProvider#getImage - */ - public Image getImage(Object element) { - if (element instanceof IStorage) - return getImageForJarEntry((IStorage)element); - - return super.getImage(element); - } - - /* (non-Javadoc) - * @see ILabelProvider#getText - */ - public String getText(Object element) { - if (element instanceof IStorage) - return ((IStorage)element).getName(); - - return super.getText(element); - } - - /* (non-Javadoc) - * - * @see IBaseLabelProvider#dispose - */ - public void dispose() { - if (fJarImageMap != null) { - Iterator each= fJarImageMap.values().iterator(); - while (each.hasNext()) { - Image image= (Image)each.next(); - image.dispose(); - } - fJarImageMap= null; - } - if (fDefaultImage != null) - fDefaultImage.dispose(); - fDefaultImage= null; - } - - /* - * Gets and caches an image for a JarEntryFile. - * The image for a JarEntryFile is retrieved from the EditorRegistry. - */ - private Image getImageForJarEntry(IStorage element) { - if (fJarImageMap == null) - return getDefaultImage(); - - if (element == null || element.getName() == null) - return getDefaultImage(); - - // Try to find icon for full name - String name= element.getName(); - Image image= (Image)fJarImageMap.get(name); - if (image != null) - return image; - IFileEditorMapping[] mappings= fEditorRegistry.getFileEditorMappings(); - int i= 0; - while (i < mappings.length) { - if (mappings[i].getLabel().equals(name)) - break; - i++; - } - String key= name; - if (i == mappings.length) { - // Try to find icon for extension - IPath path= element.getFullPath(); - if (path == null) - return getDefaultImage(); - key= path.getFileExtension(); - if (key == null) - return getDefaultImage(); - image= (Image)fJarImageMap.get(key); - if (image != null) - return image; - } - - // Get the image from the editor registry - ImageDescriptor desc= fEditorRegistry.getImageDescriptor(name); - image= desc.createImage(); - - fJarImageMap.put(key, image); - - return image; - } - - private Image getDefaultImage() { - if (fDefaultImage == null) - fDefaultImage= fEditorRegistry.getImageDescriptor((String)null).createImage(); - return fDefaultImage; - } -} diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypeInfoSorter.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypeInfoSorter.java index 769e05dc519..bbf6d7eb80a 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypeInfoSorter.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypeInfoSorter.java @@ -8,64 +8,73 @@ * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ -/* - * Created on May 18, 2004 - * - * TODO To change the template for this generated file go to - * Window - Preferences - Java - Code Style - Code Templates - */ package org.eclipse.cdt.internal.ui.browser.cbrowsing; import org.eclipse.cdt.core.browser.ITypeInfo; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerSorter; -/** - * A sorter to sort the file and the folders in the C viewer in the following order: - * 1 Project - * 2 BinaryContainer - * 3 ArchiveContainer - * 4 LibraryContainer - * 5 IncludeContainer - * 6 Source roots - * 5 C Elements - * 6 non C Elements - */ -public class TypeInfoSorter extends ViewerSorter { +public class TypeInfoSorter extends CBrowsingViewerSorter { + + public TypeInfoSorter() { + super(); + } + + public int category (Object element) { + if (element instanceof ITypeInfo) { + ITypeInfo info = (ITypeInfo)element; + String name = info.getName(); + if (info.getCElementType() == ICElement.C_NAMESPACE) { + if (name.startsWith("__")) { //$NON-NLS-1$ + return NAMESPACES_SYSTEM; + } + if (name.charAt(0) == '_') { + return NAMESPACES_RESERVED; + } + return NAMESPACES; + } else { + if (name.startsWith("__")) { //$NON-NLS-1$ + return CELEMENTS_SYSTEM; + } + if (name.charAt(0) == '_') { + return CELEMENTS_RESERVED; + } + } + return CELEMENTS; + } + return super.category(element); + } - /* (non-Javadoc) - * @see org.eclipse.jface.viewers.ViewerSorter#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) - */ public int compare(Viewer viewer, Object e1, Object e2) { - if (e1 instanceof ITypeInfo) { - return compare((ITypeInfo)e1, e2); - } else if (e1 instanceof ICElement) { - return compare((ICElement)e1, e2); - } - return 0; -// return getCollator().compare(name1, name2); - } + if (e1 instanceof ITypeInfo || e2 instanceof ITypeInfo) { + int cat1 = category(e1); + int cat2 = category(e2); - int compare(ITypeInfo t1, Object o2) { - if (o2 instanceof ITypeInfo) { - ITypeInfo t2 = (ITypeInfo)o2; - return t1.compareTo(t2); - } else if (o2 instanceof ICElement) { - ICElement e2 = (ICElement)o2; - return getCollator().compare(t1.getName(), e2.getElementName()); - } - return 0; - } + if (cat1 != cat2) + return cat1 - cat2; + + // cat1 == cat2 - int compare(ICElement e1, Object o2) { - if (o2 instanceof ITypeInfo) { - ITypeInfo t2 = (ITypeInfo)o2; - return getCollator().compare(e1.getElementName(), t2.getName()); - } else if (o2 instanceof ICElement) { - ICElement e2 = (ICElement)o2; - return getCollator().compare(e1.getElementName(), e2.getElementName()); - } - return 0; + if (cat1 == NAMESPACES || cat1 == CELEMENTS || cat1 == CELEMENTS_SYSTEM || cat1 == CELEMENTS_RESERVED) { + String name1; + String name2; + if (e1 instanceof ICElement) { + name1 = ((ICElement)e1).getElementName(); + } else if (e1 instanceof ITypeInfo) { + name1 = ((ITypeInfo)e1).getName(); + } else { + name1 = e1.toString(); + } + if (e2 instanceof ICElement) { + name2 = ((ICElement)e2).getElementName(); + } else if (e2 instanceof ITypeInfo) { + name2 = ((ITypeInfo)e2).getName(); + } else { + name2 = e2.toString(); + } + return getCollator().compare(name1, name2); + } + } + return super.compare(viewer, e1, e2); } } diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesView.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesView.java index bf79946d5c1..d187e0e9d27 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesView.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesView.java @@ -17,6 +17,7 @@ import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICModel; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IEnumeration; +import org.eclipse.cdt.core.model.INamespace; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.cdt.core.model.IStructure; import org.eclipse.cdt.core.model.ITranslationUnit; @@ -24,11 +25,11 @@ import org.eclipse.cdt.core.model.ITypeDef; import org.eclipse.cdt.internal.ui.ICHelpContextIds; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; -import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoLabelProvider; import org.eclipse.core.resources.IProject; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredViewer; +import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IActionBars; @@ -46,7 +47,7 @@ public class TypesView extends CBrowsingPart { * @see org.eclipse.jface.viewers.ILabelProvider */ protected LabelProvider createLabelProvider() { - return new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_TYPE_ONLY); + return new TypesViewLabelProvider(); } /** @@ -92,14 +93,16 @@ public class TypesView extends CBrowsingPart { return new TypesViewContentProvider(this); } - + protected ViewerSorter createViewerSorter() { + return new TypeInfoSorter(); + } /** * Adds filters the viewer of this part. */ protected void addFilters() { super.addFilters(); -// getViewer().addFilter(new NonCElementFilter()); + getViewer().addFilter(new CBrowsingElementFilter()); } /** @@ -179,14 +182,17 @@ public class TypesView extends CBrowsingPart { } else if (celem.getElementType() == ICElement.C_NAMESPACE) { return AllTypesCache.getTypeForElement(celem, true, true, null); } else { - ICElement parent = TypeUtil.getDeclaringContainerType(celem); - if (parent != null) { + ICElement parent = TypeUtil.getDeclaringType(celem); + if (parent instanceof INamespace) { + return AllTypesCache.getTypeForElement(parent, true, true, null); + } else if (parent != null) { ITypeInfo info = AllTypesCache.getTypeForElement(parent, true, true, null); if (info != null) return info.getEnclosingNamespace(true); } + IProject project = celem.getCProject().getProject(); + return AllTypesCache.getGlobalNamespace(project); } - return null; } if (element instanceof ITypeInfo) { diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java index fa00213c87e..32b141fb022 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewContentProvider.java @@ -10,12 +10,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.ui.browser.cbrowsing; -import java.util.Iterator; - import org.eclipse.cdt.core.browser.ITypeInfo; import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.viewers.IStructuredSelection; class TypesViewContentProvider extends CBrowsingContentProvider { @@ -52,39 +48,26 @@ class TypesViewContentProvider extends CBrowsingContentProvider { */ public Object[] getChildren(Object element) { if (element == null || (element instanceof ITypeInfo && !((ITypeInfo)element).exists())) { - return NO_CHILDREN; + return INVALID_INPUT; } try { startReadInDisplayThread(); - if (element instanceof IStructuredSelection) { - Assert.isLegal(false); - Object[] result= new Object[0]; - Class clazz= null; - Iterator iter= ((IStructuredSelection)element).iterator(); - while (iter.hasNext()) { - Object item= iter.next(); - if (clazz == null) - clazz= item.getClass(); - if (clazz == item.getClass()) - result= concatenate(result, getChildren(item)); - else - return NO_CHILDREN; - } - return result; - } - if (element instanceof ITypeInfo) { ITypeInfo info = (ITypeInfo)element; final int kinds[] = { ICElement.C_CLASS, ICElement.C_STRUCT, ICElement.C_UNION, ICElement.C_ENUMERATION, ICElement.C_TYPEDEF}; //TODO this should be a prefs option - return info.getEnclosedTypes(kinds); + ITypeInfo[] children = info.getEnclosedTypes(kinds); + if (children != null && children.length > 0) { + return children; + } + return EMPTY_CHILDREN; } - return NO_CHILDREN; + return INVALID_INPUT; // } catch (CModelException e) { // return NO_CHILDREN; } finally { diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewLabelProvider.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewLabelProvider.java new file mode 100644 index 00000000000..8455bd2c85c --- /dev/null +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/cbrowsing/TypesViewLabelProvider.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2004 QNX Software Systems 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 Systems - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.browser.cbrowsing; + +import org.eclipse.cdt.core.browser.ITypeInfo; +import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoLabelProvider; +import org.eclipse.swt.graphics.Image; + +public class TypesViewLabelProvider extends CBrowsingLabelProvider { + + protected static final TypeInfoLabelProvider fTypeInfoLabelProvider = new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_TYPE_ONLY); + + public TypesViewLabelProvider() { + super(); + } + + public Image getImage(Object element) { + if (element instanceof ITypeInfo) + return fTypeInfoLabelProvider.getImage(element); + return super.getImage(element); + } + + public String getText(Object element) { + if (element instanceof ITypeInfo) + return fTypeInfoLabelProvider.getText(element); + return super.getText(element); + } +} diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/OpenTypeHierarchyUtil.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/OpenTypeHierarchyUtil.java index fe925771ed9..137a5dd668b 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/OpenTypeHierarchyUtil.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/OpenTypeHierarchyUtil.java @@ -143,7 +143,7 @@ public class OpenTypeHierarchyUtil { if (!(input instanceof ICElement)) { return null; } -// try { + try { ICElement elem= (ICElement) input; switch (elem.getElementType()) { case ICElement.C_METHOD: @@ -168,9 +168,9 @@ public class OpenTypeHierarchyUtil { case ICElement.C_PROJECT: default: } -// } catch (CModelException e) { -// CUIPlugin.getDefault().log(e); -// } + } catch (CModelException e) { + CUIPlugin.getDefault().log(e); + } return null; } } diff --git a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/TypeHierarchyViewPart.java b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/TypeHierarchyViewPart.java index 08db076a500..c0fae008a0b 100644 --- a/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/TypeHierarchyViewPart.java +++ b/core/org.eclipse.cdt.ui/browser/org/eclipse/cdt/internal/ui/browser/typehierarchy/TypeHierarchyViewPart.java @@ -25,12 +25,12 @@ import org.eclipse.cdt.internal.ui.ICHelpContextIds; import org.eclipse.cdt.internal.ui.IContextMenuConstants; import org.eclipse.cdt.internal.ui.actions.CompositeActionGroup; import org.eclipse.cdt.internal.ui.actions.SelectAllAction; -import org.eclipse.cdt.internal.ui.browser.cbrowsing.StatusBarUpdater; import org.eclipse.cdt.internal.ui.util.EditorUtility; import org.eclipse.cdt.internal.ui.util.ExceptionHandler; import org.eclipse.cdt.internal.ui.viewsupport.CElementLabels; import org.eclipse.cdt.internal.ui.viewsupport.CUILabelProvider; import org.eclipse.cdt.internal.ui.viewsupport.IViewPartInputProvider; +import org.eclipse.cdt.internal.ui.viewsupport.StatusBarUpdater; import org.eclipse.cdt.internal.ui.workingsets.WorkingSetFilterActionGroup; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; @@ -1513,15 +1513,17 @@ public class TypeHierarchyViewPart extends ViewPart implements ITypeHierarchyVie ICElement elem= (ICElement)editor.getEditorInput().getAdapter(ICElement.class); TypeHierarchyViewer currentViewer= getCurrentViewer(); if (elem instanceof ITranslationUnit) { -// ICElement[] allTypes= ((ITranslationUnit)elem).getAllTypes(); - ICElement[] allTypes= TypeUtil.getTypes(elem); - for (int i= 0; i < allTypes.length; i++) { - if (currentViewer.isElementShown(allTypes[i])) { - internalSelectType(allTypes[i], true); - updateMethodViewer(allTypes[i]); - return; + try { + ICElement[] allTypes= TypeUtil.getAllTypes((ITranslationUnit)elem); + for (int i= 0; i < allTypes.length; i++) { + if (currentViewer.isElementShown(allTypes[i])) { + internalSelectType(allTypes[i], true); + updateMethodViewer(allTypes[i]); + return; + } } - } + } catch (CModelException e) { + } } }