package org.objectstyle.wolips.wodclipse.core.refactoring;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;
import java.util.List;
import jp.aonir.fuzzyxml.FuzzyXMLDocument;
import jp.aonir.fuzzyxml.FuzzyXMLElement;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.text.edits.TextEdit;
import org.objectstyle.wolips.bindings.wod.IWodElement;
import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache;
import org.objectstyle.wolips.wodclipse.core.util.WodDocumentUtils;
public class ChangeElementTypeRefactoring implements IRunnableWithProgress {
private IWodElement _element;
private String _newType;
private WodParserCache _cache;
public ChangeElementTypeRefactoring(String newType, IWodElement element, WodParserCache cache) {
_newType = newType;
_element = element;
_cache = cache;
}
public void run(IProgressMonitor monitor) throws InvocationTargetException {
try {
Position typePosition = _element.getElementTypePosition();
if (_element.isInline()) {
IDocument htmlDocument = _cache.getHtmlEntry().getDocument();
if (htmlDocument != null) {
List<TextEdit> htmlEdits = new LinkedList<TextEdit>();
FuzzyXMLDocument xmlDocument = _cache.getHtmlEntry().getModel();
if (xmlDocument != null) {
FuzzyXMLElement xmlElement = xmlDocument.getElementByOffset(typePosition.getOffset());
if (xmlElement != null && xmlElement.hasCloseTag()) {
if (xmlElement.getName().contains("wo")) {
htmlEdits.add(new ReplaceEdit(xmlElement.getCloseTagOffset() + xmlElement.getCloseNameOffset() + 1, xmlElement.getCloseNameLength(), "wo:" + _newType));
}
else {
htmlEdits.add(new ReplaceEdit(xmlElement.getCloseTagOffset() + xmlElement.getCloseNameOffset() + 1, xmlElement.getCloseNameLength(), "tb:" + _newType));
}
}
}
htmlEdits.add(new ReplaceEdit(typePosition.getOffset(), typePosition.getLength(), _newType));
WodDocumentUtils.applyEdits(htmlDocument, htmlEdits);
}
}
else {
IDocument wodDocument = _cache.getWodEntry().getDocument();
if (wodDocument != null) {
List<TextEdit> wodEdits = new LinkedList<TextEdit>();
wodEdits.add(new ReplaceEdit(typePosition.getOffset(), typePosition.getLength(), _newType));
WodDocumentUtils.applyEdits(wodDocument, wodEdits);
}
}
}
catch (Exception e) {
throw new InvocationTargetException(e, "Failed to refactor.");
}
}
public static void run(String newType, IWodElement element, WodParserCache cache, IProgressMonitor progressMonitor) throws CoreException, InvocationTargetException, InterruptedException {
TemplateRefactoring.processHtmlAndWod(new ChangeElementTypeRefactoring(newType, element, cache), cache, progressMonitor);
}
}