package org.objectstyle.wolips.wodclipse.core.refactoring;
import java.lang.reflect.InvocationTargetException;
import jp.aonir.fuzzyxml.FuzzyXMLDocType;
import jp.aonir.fuzzyxml.FuzzyXMLDocument;
import jp.aonir.fuzzyxml.FuzzyXMLElement;
import jp.aonir.fuzzyxml.FuzzyXMLNode;
import jp.aonir.fuzzyxml.FuzzyXMLProcessingInstruction;
import jp.aonir.fuzzyxml.internal.FuzzyXMLFormatComposite;
import jp.aonir.fuzzyxml.internal.RenderContext;
import jp.aonir.fuzzyxml.internal.WOHTMLRenderDelegate;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.IDocument;
import org.objectstyle.wolips.wodclipse.core.Activator;
import org.objectstyle.wolips.wodclipse.core.completion.WodParserCache;
import org.objectstyle.wolips.wodclipse.core.preferences.PreferenceConstants;
public class FormatRefactoring implements IRunnableWithProgress {
private WodParserCache _cache;
public FormatRefactoring(WodParserCache cache) {
_cache = cache;
}
public void run(IProgressMonitor monitor) throws InvocationTargetException {
try {
_cache.clearCache();
FuzzyXMLDocument htmlModel = _cache.getHtmlEntry().getModel();
FuzzyXMLElement documentElement = htmlModel.getDocumentElement();
IDocument htmlDocument = _cache.getHtmlEntry().getDocument();
IPreferenceStore prefs = Activator.getDefault().getPreferenceStore();
RenderContext renderContext = new RenderContext(true);
renderContext.setShowNewlines(true);
renderContext.setIndentSize(prefs.getInt(PreferenceConstants.INDENT_SIZE));
renderContext.setIndentTabs(prefs.getBoolean(PreferenceConstants.INDENT_TABS));
renderContext.setTrim(true);
renderContext.setLowercaseAttributes(prefs.getBoolean(PreferenceConstants.LOWERCASE_ATTRIBUTES));
renderContext.setLowercaseTags(prefs.getBoolean(PreferenceConstants.LOWERCASE_TAGS));
renderContext.setSpacesAroundEquals(prefs.getBoolean(PreferenceConstants.SPACES_AROUND_EQUALS));
renderContext.setSpaceInEmptyTags(true);
renderContext.setAddMissingQuotes(true);
renderContext.setDelegate(new WOHTMLRenderDelegate(prefs.getBoolean(PreferenceConstants.STICKY_WOTAGS)));
StringBuffer htmlBuffer = new StringBuffer();
FuzzyXMLDocType docType = htmlModel.getDocumentType();
for (FuzzyXMLNode node : documentElement.getChildren()) {
if (docType != null) {
if (!(node instanceof FuzzyXMLProcessingInstruction || FuzzyXMLFormatComposite.isHidden(node))) {
docType.toXMLString(renderContext, htmlBuffer);
docType = null;
}
}
node.toXMLString(renderContext, htmlBuffer);
}
htmlDocument.set(htmlBuffer.toString().trim());
}
catch (Exception e) {
throw new InvocationTargetException(e, "Failed to reformat.");
}
}
public static void run(WodParserCache cache, IProgressMonitor progressMonitor) throws InvocationTargetException, InterruptedException, CoreException {
TemplateRefactoring.processHtmlAndWod(new FormatRefactoring(cache), cache, progressMonitor);
}
}