/******************************************************************************* * Copyright (c) 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.ui.search; import java.util.ArrayList; import java.util.HashMap; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.internal.ui.search.DLTKElementLine; import org.eclipse.php.core.ast.nodes.Program; import org.eclipse.php.internal.core.search.IOccurrencesFinder; import org.eclipse.php.internal.core.search.Messages; import org.eclipse.php.internal.core.search.IOccurrencesFinder.OccurrenceLocation; import org.eclipse.php.internal.ui.util.StatusInfo; import org.eclipse.search.ui.ISearchQuery; import org.eclipse.search.ui.ISearchResult; import org.eclipse.search.ui.text.Match; import org.eclipse.wst.sse.ui.internal.search.OccurrencesSearchResult; public class OccurrencesSearchQuery implements ISearchQuery { private final OccurrencesSearchResult fResult; private IOccurrencesFinder fFinder; private final ISourceModule fElement; private final String fJobLabel; private final String fSingularLabel; private final String fPluralLabel; private final String fName; private final String fFinderId; public OccurrencesSearchQuery(IOccurrencesFinder finder, ISourceModule element) { fFinder = finder; fElement = element; fJobLabel = fFinder.getJobLabel(); fResult = new OccurrencesSearchResult(this); fSingularLabel = fFinder.getUnformattedSingularLabel(); fPluralLabel = fFinder.getUnformattedPluralLabel(); fName = fFinder.getElementName(); fFinderId = fFinder.getID(); } /* * @seeorg.eclipse.search.ui.ISearchQuery#run(org.eclipse.core.runtime. * IProgressMonitor) */ @Override public IStatus run(IProgressMonitor monitor) { if (fFinder == null) { return new StatusInfo(IStatus.ERROR, org.eclipse.php.internal.ui.search.Messages.OccurrencesSearchQuery_0); } if (monitor == null) monitor = new NullProgressMonitor(); try { OccurrenceLocation[] occurrences = fFinder.getOccurrences(); if (occurrences != null) { HashMap lineMap = new HashMap(); Program astRoot = fFinder.getASTRoot(); ArrayList resultingMatches = new ArrayList(); for (int i = 0; i < occurrences.length; i++) { OccurrenceLocation loc = occurrences[i]; DLTKElementLine lineKey = getLineElement(astRoot, loc, lineMap); if (lineKey != null) { OccurrenceMatch match = new OccurrenceMatch(lineKey, loc.getOffset(), loc.getLength(), loc.getFlags()); resultingMatches.add(match); // TODO see location flags for more information // lineKey.setFlags(lineKey.getFlags() | // loc.getFlags()); } } if (!resultingMatches.isEmpty()) { fResult.addMatches((Match[]) resultingMatches.toArray(new Match[resultingMatches.size()])); } } } finally { // Don't leak AST: fFinder = null; monitor.done(); } return Status.OK_STATUS; } private DLTKElementLine getLineElement(Program astRoot, OccurrenceLocation location, HashMap lineToGroup) { int lineNumber = astRoot.getLineNumber(location.getOffset()); if (lineNumber <= 0) { return null; } DLTKElementLine lineElement = null; Integer key = Integer.valueOf(lineNumber); lineElement = (DLTKElementLine) lineToGroup.get(key); if (lineElement == null) { int lineStartOffset = astRoot.getPosition(lineNumber, 0); if (lineStartOffset >= 0) { // lineNumber - 1, FIXME - set the correct line content lineElement = new DLTKElementLine(astRoot.getSourceModule(), lineStartOffset, ""); //$NON-NLS-1$ lineToGroup.put(key, lineElement); } } return lineElement; } /* * @see org.eclipse.search.ui.ISearchQuery#getLabel() */ @Override public String getLabel() { return fJobLabel; } public String getResultLabel(int nMatches) { if (nMatches == 1) { return Messages.format(fSingularLabel, new Object[] { fName, fElement.getElementName() }); } else { return Messages.format(fPluralLabel, new Object[] { fName, Integer.valueOf(nMatches), fElement.getElementName() }); } } /* * @see org.eclipse.search.ui.ISearchQuery#canRerun() */ @Override public boolean canRerun() { return false; // must release finder to not keep AST reference } /* * @see org.eclipse.search.ui.ISearchQuery#canRunInBackground() */ @Override public boolean canRunInBackground() { return true; } /* * @see org.eclipse.search.ui.ISearchQuery#getSearchResult() */ @Override public ISearchResult getSearchResult() { return fResult; } /** * Returns the finder ID. * * @return the finder ID */ public String getFinderId() { return fFinderId; } }