blob: cce160c6f9448467f22dc6195f3876a50ce4232e [file] [log] [blame]
package org.eclipse.wst.xsd.ui.internal.refactor.rename;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.TextChange;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.wst.common.core.search.SearchMatch;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.eclipse.wst.xsd.ui.internal.refactor.RefactoringMessages;
import org.eclipse.wst.xsd.ui.internal.refactor.TextChangeManager;
import org.eclipse.wst.xsd.ui.internal.refactor.util.TextChangeCompatibility;
import org.eclipse.xsd.util.XSDConstants;
import org.w3c.dom.Node;
public class XMLComponentRenameParticipant extends RenameParticipant {
protected SearchMatch match;
protected TextChangeManager changeManager;
protected List matches;
protected boolean initialize(Object element) {
if(getArguments() instanceof ComponentRenameArguments){
// changeManger is passed in from the RenameComponentProcessor to collect all the changes
changeManager = ((ComponentRenameArguments)getArguments()).getChangeManager();
}
return false;
}
public String getName() {
return "XML Component Rename Participant";
}
public RefactoringStatus checkConditions(IProgressMonitor monitor,
CheckConditionsContext context) throws OperationCanceledException {
return null;
}
public TextChangeManager getChangeManager(){
if(changeManager == null){
changeManager = new TextChangeManager(false);
}
return changeManager;
}
private RefactoringStatus createRenameChanges(final IProgressMonitor monitor) throws CoreException {
Assert.isNotNull(monitor);
final RefactoringStatus status= new RefactoringStatus();
try {
monitor.beginTask("RefactoringMessages.RenameComponentRefactoring_searching", 1);
createRenameChanges(new SubProgressMonitor(monitor, 1));
//updateChangeManager(new SubProgressMonitor(monitor, 1), status);
} finally {
monitor.done();
}
return status;
}
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
//System.out.println("createChange(" + getChangeManager() + ")" + matches.size());
for (Iterator iter = matches.iterator(); iter.hasNext();) {
SearchMatch match = (SearchMatch) iter.next();
TextChange textChange = getChangeManager().get(match.getFile());
String newName = getArguments().getNewName();
String qualifier = "";
if(getArguments() instanceof ComponentRenameArguments){
qualifier = ((ComponentRenameArguments)getArguments()).getQualifier();
}
if(match.getObject() instanceof Node){
Node node = (Node)match.getObject();
if(node instanceof IDOMAttr){
IDOMAttr attr = (IDOMAttr)node;
IDOMElement element = (IDOMElement)attr.getOwnerElement() ;
newName = getNewQName(element, qualifier, newName);
}
newName = RenameComponentProcessor.quoteString(newName);
}
ReplaceEdit replaceEdit = new ReplaceEdit(match.getOffset(), match.getLength(), newName );
String editName = RefactoringMessages.getString("RenameComponentProcessor.Component_Refactoring_update_reference");
// System.out.println("textChange " + textChange + "/ replaceEdit " + replaceEdit);
TextChangeCompatibility.addTextEdit(textChange, editName, replaceEdit);
}
// don't create any change now, all the changes are in changeManger variable and will be combined in RenameComponentProcessor.postCreateChange method
return null;
}
private static String getNewQName(Node node, String targetNamespace, String newName) {
StringBuffer sb = new StringBuffer();
if (newName != null) {
String prefix = XSDConstants.lookupQualifier(node, targetNamespace);
if (prefix != null && prefix.length() > 0) {
sb.append(prefix);
sb.append(":");
sb.append(newName);
} else {
sb.append(newName);
}
} else {
sb.append(newName);
}
return sb.toString();
}
public void setChangeManager(TextChangeManager changeManager)
{
this.changeManager = changeManager;
}
}