blob: 899026c5c7d0d10ff6074e57d3ad24fcbe616fa8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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.ant.internal.ui.editor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.ant.internal.ui.editor.text.XMLTextHover;
import org.eclipse.ant.internal.ui.model.AntElementNode;
import org.eclipse.ant.internal.ui.model.AntModel;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
public class OccurrencesFinder {
private AntModel fAntModel;
private AntEditor fEditor;
private int fOffset;
private IDocument fDocument;
public OccurrencesFinder(AntEditor editor, AntModel model, IDocument document, int offset) {
fAntModel= model;
fEditor= editor;
fDocument= document;
fOffset= offset;
}
public List perform() {
if (fOffset == 0 || fAntModel == null) {
return null;
}
AntElementNode container= fAntModel.getNode(fOffset, false);
if (container == null) {
return null;
}
IRegion region= XMLTextHover.getRegion(fEditor.getViewer(), fOffset);
if (region != null) {
if (!container.isRegionPotentialReference(region)) {
return null;
}
}
AntElementNode node;
if (container.isFromDeclaration(region)) {
node= container;
} else {
Object potentialNode= fEditor.findTarget(region);
if (!(potentialNode instanceof AntElementNode)) {
return null;
}
node= (AntElementNode) potentialNode;
}
String occurrencesIdentifier= node.getOccurrencesIdentifier();
if (occurrencesIdentifier == null) {
return null;
}
List nodes= new ArrayList(1);
nodes.add(fAntModel.getProjectNode());
List usages= new ArrayList();
usages.add(node);
scanNodesForOccurrences(nodes, usages, occurrencesIdentifier);
String identifier;
try {
identifier= fDocument.get(region.getOffset(), region.getLength());
} catch (BadLocationException e) {
return null;
}
int length= identifier.length();
if (length == 0) {
return null;
}
List positions= new ArrayList(usages.size());
for (Iterator each= usages.iterator(); each.hasNext();) {
AntElementNode currentNode= (AntElementNode)each.next();
List offsets= currentNode.computeIdentifierOffsets(identifier);
if (offsets != null) {
for (int i = 0; i < offsets.size(); i++) {
positions.add(new Position(((Integer)offsets.get(i)).intValue(), length));
}
}
}
return positions;
}
private void scanNodesForOccurrences(List nodes, List usages, String identifier) {
Iterator iter= nodes.iterator();
while (iter.hasNext()) {
AntElementNode node = (AntElementNode) iter.next();
if (!usages.contains(node) && node.containsOccurrence(identifier)) {
usages.add(node);
}
if (node.hasChildren()) {
scanNodesForOccurrences(node.getChildNodes(), usages, identifier);
}
}
}
}