blob: 0c9d09ff6ef778155c307685c0fb06cbfee0b4e1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 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
*
*******************************************************************************/
package org.eclipse.wst.sse.ui.internal.search;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.search.ui.ISearchQuery;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
/**
* <p>
* Finds occurrences of a specified region type w/ region text in an
* IStructuredDocument. Clients must implement getPartitionTypes() and
* getRegionTypes() to indicate which partition types and region types it can
* operate on.
* </p>
*
* <p>
* Clients should override <code>getSearchQuery()</code> in order to provide
* their own type of "search" (eg. searching for XML start tags, searching for
* Java elements, etc...)
* </p>
*
*/
abstract public class FindOccurrencesProcessor {
public boolean findOccurrences(IDocument document, ITextSelection textSelection, IFile file) {
boolean findOccurrences = false;
// determine if action should be enabled or not
if (document instanceof IStructuredDocument) {
IStructuredDocument structuredDocument = (IStructuredDocument) document;
IStructuredDocumentRegion sdRegion = structuredDocument.getRegionAtCharacterOffset(textSelection.getOffset());
if (sdRegion != null) {
ITextRegion r = sdRegion.getRegionAtCharacterOffset(textSelection.getOffset());
if (r != null) {
String type = r.getType();
if (enabledForRegionType(type)) {
String matchText = sdRegion.getText(r);
// first of all activate the view
NewSearchUI.activateSearchResultView();
if (matchText != null && type != null) {
ISearchQuery searchQuery = getSearchQuery(file, structuredDocument, matchText, type, textSelection);
if (searchQuery != null) {
if (searchQuery.canRunInBackground())
NewSearchUI.runQueryInBackground(searchQuery);
else
NewSearchUI.runQueryInForeground(null, searchQuery);
}
findOccurrences = true;
}
}
}
}
}
return findOccurrences;
}
/**
* @param regionType
* @return <code>true</code> if this action can operate on this region
* type (ITextRegion), otherwise false.
*/
private boolean enabledForRegionType(String regionType) {
String[] accept = getRegionTypes();
for (int i = 0; i < accept.length; i++) {
if (regionType.equals(accept[i]))
return true;
}
return false;
}
/**
* Clients should override this to enable find occurrences on certain
* partition(s).
*/
abstract protected String[] getPartitionTypes();
/**
* Clients should override this to enable find occurrences on different
* region type(s).
*/
abstract protected String[] getRegionTypes();
/**
* Clients should override to provide their own search for the file.
*/
protected ISearchQuery getSearchQuery(IFile file, IStructuredDocument document, String regionText, String regionType, ITextSelection textSelection) {
return new OccurrencesSearchQuery(file, document, regionText, regionType);
}
/**
* @param partitionType
* @return <code>true</code> if this action can operate on this type of
* partition, otherwise <code>false</code>.
*/
public boolean enabledForParitition(String partitionType) {
String[] accept = getPartitionTypes();
for (int i = 0; i < accept.length; i++) {
if (partitionType.equals(accept[i]))
return true;
}
return false;
}
}