From 41c9d0faec76b7ccc06749d66c0696ef0989f34e Mon Sep 17 00:00:00 2001 From: Bogdan Gheorghe Date: Tue, 6 Jul 2004 18:03:49 +0000 Subject: [PATCH] - Added support for search name grouping. - Handled the case of CContainer in both updateIndexAddResource and updateIndexRemoveResource. - Added timing for merge operations - controlled by Indexer tracing option - Modified removeSourceFolderFromIndex in IndexManager to take an IProject --- core/org.eclipse.cdt.core/ChangeLog | 7 ++ core/org.eclipse.cdt.core/index/ChangeLog | 7 ++ .../core/index/impl/MergeFactory.java | 10 +++ .../core/search/indexing/IndexManager.java | 6 +- .../internal/core/model/DeltaProcessor.java | 34 ++++++---- core/org.eclipse.cdt.ui/ChangeLog | 11 +++ .../cdt/internal/ui/search/CSearchMatch.java | 39 +++++++++++ .../cdt/internal/ui/search/CSearchResult.java | 23 ++++--- .../internal/ui/search/CSearchResultPage.java | 6 +- .../ui/search/LevelTreeContentProvider.java | 24 ++++++- .../ui/search/NewSearchResultCollector.java | 19 +++++- .../cdt/ui/CSearchResultLabelProvider.java | 67 +++++++++++++++++-- 12 files changed, 213 insertions(+), 40 deletions(-) create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMatch.java diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 771d257f1d6..2026c6e5b89 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,10 @@ +2004-07-06 Bogdan Gheorghe + Handled the case of CContainer in both updateIndexAddResource and + updateIndexRemoveResource. + + * model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java + + 2004-07-06 Hoda Amer Fix for PR 68933 : [Content Assist] removes asterisks from parameter prompt diff --git a/core/org.eclipse.cdt.core/index/ChangeLog b/core/org.eclipse.cdt.core/index/ChangeLog index 6d387156b14..88af82d1d51 100644 --- a/core/org.eclipse.cdt.core/index/ChangeLog +++ b/core/org.eclipse.cdt.core/index/ChangeLog @@ -1,3 +1,10 @@ +2004-07-06 Bogdan Gheorghe + Added timing for merge operations - controlled by Indexer tracing option + Modified removeSourceFolderFromIndex in IndexManager to take an IProject + + * index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java + * index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java + 2004-06-28 Bogdan Gheorghe Fix for Bug 60948: indexer should pick up all headers in include path diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java index 6b860fc46ee..6bddc463ac5 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java @@ -72,6 +72,11 @@ public class MergeFactory { * Merges the 2 indexes into a new one on the disk. */ public void merge() throws IOException { + long startTime = 0; + if (IndexManager.VERBOSE){ + JobManager.verbose("-> starting merge"); //$NON-NLS-1$ + startTime = System.currentTimeMillis(); + } try { //init addsInput.open(); @@ -106,6 +111,11 @@ public class MergeFactory { oldInput.close(); addsInput.close(); mergeOutput.close(); + + if (IndexManager.VERBOSE){ + long elapsedTime = System.currentTimeMillis() - startTime; + JobManager.verbose("-> merge complete: " + (elapsedTime > 0 ? elapsedTime : 0) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ + } } } /** diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java index e36e0e0f76e..39fbb466fb5 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java @@ -34,7 +34,6 @@ import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.index.IIndex; import org.eclipse.cdt.internal.core.index.impl.Index; import org.eclipse.cdt.internal.core.index.impl.IndexDelta; -import org.eclipse.cdt.internal.core.model.CProject; import org.eclipse.cdt.internal.core.search.CWorkspaceScope; import org.eclipse.cdt.internal.core.search.IndexSelector; import org.eclipse.cdt.internal.core.search.SimpleLookupTable; @@ -539,9 +538,8 @@ public class IndexManager extends JobManager implements IIndexConstants { /** * Remove the content of the given source folder from the index. */ - public void removeSourceFolderFromIndex(CProject cProject, IPath sourceFolder, char[][] exclusionPatterns) { - IProject project = cProject.getProject(); - + public void removeSourceFolderFromIndex(IProject project, IPath sourceFolder, char[][] exclusionPatterns) { + if( !isIndexEnabled( project ) ) return; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java index 785c00dad91..724da96dc9d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java @@ -571,7 +571,11 @@ public class DeltaProcessor { case ICElement.C_PROJECT : this.indexManager.indexAll(element.getCProject().getProject()); break; - + + case ICElement.C_CCONTAINER: + indexManager.indexSourceFolder(element.getCProject().getProject(),element.getPath(),null); + break; + case ICElement.C_UNIT: IFile file = (IFile) delta.getResource(); IProject filesProject = file.getProject(); @@ -588,19 +592,23 @@ public class DeltaProcessor { switch (element.getElementType()) { case ICElement.C_PROJECT : - IPath fullPath = element.getCProject().getProject().getFullPath(); - if( delta.getKind() == IResourceDelta.CHANGED ) - indexManager.discardJobs(fullPath.segment(0)); - indexManager.removeIndexFamily(fullPath); - // NB: Discarding index jobs belonging to this project was done during PRE_DELETE - break; - // NB: Update of index if project is opened, closed, or its c nature is added or removed - // is done in updateCurrentDeltaAndIndex - + IPath fullPath = element.getCProject().getProject().getFullPath(); + if( delta.getKind() == IResourceDelta.CHANGED ) + indexManager.discardJobs(fullPath.segment(0)); + indexManager.removeIndexFamily(fullPath); + // NB: Discarding index jobs belonging to this project was done during PRE_DELETE + break; + // NB: Update of index if project is opened, closed, or its c nature is added or removed + // is done in updateCurrentDeltaAndIndex + + case ICElement.C_CCONTAINER: + indexManager.removeSourceFolderFromIndex(element.getCProject().getProject(),element.getPath(),null); + break; + case ICElement.C_UNIT: - IFile file = (IFile) delta.getResource(); - indexManager.remove(file.getFullPath().toString(), file.getProject().getFullPath()); - break; + IFile file = (IFile) delta.getResource(); + indexManager.remove(file.getFullPath().toString(), file.getProject().getFullPath()); + break; } diff --git a/core/org.eclipse.cdt.ui/ChangeLog b/core/org.eclipse.cdt.ui/ChangeLog index 2a61cdfd718..ae7b80ce0ca 100644 --- a/core/org.eclipse.cdt.ui/ChangeLog +++ b/core/org.eclipse.cdt.ui/ChangeLog @@ -1,3 +1,14 @@ +2004-07-06 Bogdan Gheorghe + + Added support for search name grouping. + + * src/org/eclipse/cdt/internal/ui/search/CSearchMatch.java + * src/org/eclipse/cdt/internal/ui/search/CSearchResult.java + * src/org/eclipse/cdt/internal/ui/search/CSearchResultPage.java + * src/org/eclipse/cdt/internal/ui/search/LevelTreeContentProvider.java + * src/org/eclipse/cdt/internal/ui/search/NewSearchResultCollector.java + * src/org/eclipse/cdt/ui/CSearchResultLabelProvider.java + 2004-07-06 Chris Wiebe This patch prevents some NPEs from happening in the class browser. I diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMatch.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMatch.java new file mode 100644 index 00000000000..3f04195a512 --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchMatch.java @@ -0,0 +1,39 @@ +/* + * Created on Jun 27, 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.search; + +import org.eclipse.cdt.core.search.BasicSearchMatch; +import org.eclipse.cdt.core.search.IMatch; +import org.eclipse.search.ui.text.Match; + +/** + * @author bgheorgh + * + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class CSearchMatch extends Match { + + private BasicSearchMatch searchMatch; + /** + * @param element + * @param offset + * @param length + */ + public CSearchMatch(Object element, int offset, int length, IMatch match) { + super(element, offset, length); + if (match instanceof BasicSearchMatch) + searchMatch = (BasicSearchMatch)match; + } + + /** + * @return Returns the searchMatch. + */ + public BasicSearchMatch getSearchMatch() { + return searchMatch; + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchResult.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchResult.java index b5f64d13acc..af7befb8416 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchResult.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchResult.java @@ -117,6 +117,16 @@ public class CSearchResult extends AbstractTextSearchResult implements IEditorMa else return false; } + } else if (match instanceof CSearchMatch) { + BasicSearchMatch searchMatch = ((CSearchMatch) match).getSearchMatch(); + if (editorInput instanceof IFileEditorInput){ + IFile inputFile= ((IFileEditorInput)editorInput).getFile(); + IResource matchFile = searchMatch.getResource(); + if (matchFile != null) + return inputFile.equals(matchFile); + else + return false; + } } else if (match.getElement() instanceof IFile) { if (editorInput instanceof IFileEditorInput) { return ((IFileEditorInput)editorInput).getFile().equals(match.getElement()); @@ -231,15 +241,10 @@ public class CSearchResult extends AbstractTextSearchResult implements IEditorMa private void collectMatches(Set matches, Object[] test, IFile file) { for (int i=0; i 0) + return getParent(m[0]); + + return null; + } + /** * returns true if the child already was a child of parent. * diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/NewSearchResultCollector.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/NewSearchResultCollector.java index c58f4d15112..2f44faf252d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/NewSearchResultCollector.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/NewSearchResultCollector.java @@ -28,6 +28,21 @@ import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.search.ui.text.Match; public class NewSearchResultCollector extends BasicSearchResultCollector { + public static final int PARENT_LENGTH = 7; + public static final String PARENT = "PARENT:"; //$NON-NLS-1$ + + public static final int NAME_LENGTH = 5; + public static final String NAME = "NAME:"; //$NON-NLS-1$ + + public static final int LOCATION_LENGTH = 9; + public static final String LOCATION = "LOCATION:"; //$NON-NLS-1$ + + public static final int ELEMENTTYPE_LENGTH = 12; + public static final String ELEMENTTYPE = "ELEMENTTYPE:"; //$NON-NLS-1$ + + public static final int VISIBILITY_LENGTH = 11; + public static final String VISIBILITY = "VISIBILITY:"; //$NON-NLS-1$ + private CSearchResult fSearch; private IProgressMonitor fProgressMonitor; private int fMatchCount; @@ -77,7 +92,9 @@ public class NewSearchResultCollector extends BasicSearchResultCollector { fMatchCount++; int start = match.getStartOffset(); int end = match.getEndOffset(); - fSearch.addMatch(new Match(match,start,end-start)); + String classifier = PARENT + match.getParentName() + NAME + match.getName() + LOCATION + match.getLocation().toOSString() + ELEMENTTYPE + match.getElementType() + VISIBILITY + match.getVisibility(); + fSearch.addMatch(new CSearchMatch(classifier,start,end-start, match)); + return true; } else { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CSearchResultLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CSearchResultLabelProvider.java index 7ad2f1fb8e5..1fb6f77ea5f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CSearchResultLabelProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CSearchResultLabelProvider.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.internal.ui.CPluginImages; import org.eclipse.cdt.internal.ui.search.CSearchMessages; import org.eclipse.cdt.internal.ui.search.CSearchResultCollector; import org.eclipse.cdt.internal.ui.search.CSearchResultPage; +import org.eclipse.cdt.internal.ui.search.NewSearchResultCollector; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; @@ -35,7 +36,7 @@ import org.eclipse.swt.graphics.Point; * Window>Preferences>Java>Code Generation>Code and Comments */ public class CSearchResultLabelProvider extends LabelProvider { - + public static final int SHOW_NAME_ONLY = 0; public static final int SHOW_ELEMENT_CONTAINER = 1; public static final int SHOW_CONTAINER_ELEMENT = 2; @@ -58,6 +59,7 @@ public class CSearchResultLabelProvider extends LabelProvider { public Image getImage( Object element ) { IMatch match = null; int elementType = -1; + int visibility = -1; if( element instanceof ISearchResultViewEntry ){ ISearchResultViewEntry viewEntry = (ISearchResultViewEntry)element; IMarker marker = viewEntry.getSelectedMarker(); @@ -66,6 +68,7 @@ public class CSearchResultLabelProvider extends LabelProvider { if( match == null ) return null; elementType = match.getElementType(); + visibility = match.getVisibility(); } catch (CoreException e) { return null; } @@ -74,10 +77,20 @@ public class CSearchResultLabelProvider extends LabelProvider { if( match == null ) return null; elementType = match.getElementType(); - + visibility = match.getVisibility(); } else if (element instanceof ICElement){ elementType = ((ICElement) element).getElementType(); - } + } else if (element instanceof String){ + String eleString = (String) element; + int elIndex = eleString.indexOf(NewSearchResultCollector.ELEMENTTYPE); + int vizIndex = eleString.indexOf(NewSearchResultCollector.VISIBILITY); + + String elType = eleString.substring(elIndex+NewSearchResultCollector.ELEMENTTYPE_LENGTH,vizIndex); + String elViz = eleString.substring(vizIndex+NewSearchResultCollector.VISIBILITY_LENGTH,eleString.length()); + + elementType = new Integer(elType).intValue(); + visibility = new Integer(elViz).intValue(); + } @@ -99,7 +112,7 @@ public class CSearchResultLabelProvider extends LabelProvider { case ICElement.C_UNIT: imageDescriptor = CPluginImages.DESC_OBJS_TUNIT; break; case ICElement.C_FIELD: { - switch( match.getVisibility() ){ + switch( visibility ){ case ICElement.CPP_PUBLIC: imageDescriptor = CPluginImages.DESC_OBJS_PUBLIC_FIELD; break; case ICElement.CPP_PRIVATE: imageDescriptor = CPluginImages.DESC_OBJS_PRIVATE_FIELD; break; default: imageDescriptor = CPluginImages.DESC_OBJS_PROTECTED_FIELD; break; @@ -108,7 +121,7 @@ public class CSearchResultLabelProvider extends LabelProvider { } case ICElement.C_METHOD: { - switch( match.getVisibility() ){ + switch( visibility ){ case ICElement.CPP_PUBLIC: imageDescriptor = CPluginImages.DESC_OBJS_PUBLIC_METHOD; break; case ICElement.CPP_PRIVATE: imageDescriptor = CPluginImages.DESC_OBJS_PRIVATE_METHOD; break; default: imageDescriptor = CPluginImages.DESC_OBJS_PROTECTED_METHOD; break; @@ -147,9 +160,21 @@ public class CSearchResultLabelProvider extends LabelProvider { } } else if( element instanceof IMatch ){ match = (IMatch) element; - } - else if ( element instanceof ICElement){ + } else if ( element instanceof ICElement){ return getElementText((ICElement) element); + } else if (element instanceof String){ + String elString = (String) element; + + int parentIndex = elString.indexOf(NewSearchResultCollector.PARENT); + int nameIndex = elString.indexOf(NewSearchResultCollector.NAME); + int locationIndex = elString.indexOf(NewSearchResultCollector.LOCATION); + int elementIndex = elString.indexOf(NewSearchResultCollector.ELEMENTTYPE); + + String elParent = elString.substring(parentIndex+NewSearchResultCollector.PARENT_LENGTH,nameIndex); + String elName = elString.substring(nameIndex+NewSearchResultCollector.NAME_LENGTH,locationIndex); + String elPath = elString.substring(locationIndex+NewSearchResultCollector.LOCATION_LENGTH, elementIndex); + + return getCSearchSortElementText(elParent, elName, elPath); } if( match == null ) @@ -189,6 +214,34 @@ public class CSearchResultLabelProvider extends LabelProvider { return result; } + /** + * @param element + * @return + */ + private String getCSearchSortElementText(String parentName, String name, String path) { + String result = ""; //$NON-NLS-1$ + + switch( getOrder() ){ + case SHOW_NAME_ONLY: + result = name; + case SHOW_ELEMENT_CONTAINER: + if( !parentName.equals("") ) //$NON-NLS-1$ + result = name + " - " + parentName + " ( " + path + " )"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + else + result = name+ " ( " + path + " )"; //$NON-NLS-1$ //$NON-NLS-2$ + + break; + case SHOW_PATH: + result = path + " - " + parentName + "::" + name; //$NON-NLS-1$ //$NON-NLS-2$ + break; + case SHOW_CONTAINER_ELEMENT: + result = parentName + "::" + name + " ( " + path + " )"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + break; + } + + return result; + } + private String getElementText(ICElement element){ String result=""; //$NON-NLS-1$