package krasa.formatter.adapter;
import krasa.formatter.common.ModifiableFile;
import krasa.formatter.eclipse.CodeFormatterFacade;
import krasa.formatter.exception.FileDoesNotExistsException;
import krasa.formatter.exception.FormattingFailedException;
import krasa.formatter.plugin.InvalidPropertyFile;
import krasa.formatter.settings.Settings;
import krasa.formatter.settings.provider.CppPropertiesProvider;
import org.eclipse.cdt.core.ToolFactory;
import org.eclipse.cdt.core.formatter.CodeFormatter;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.text.edits.TextEdit;
import com.intellij.psi.PsiFile;
/**
* @author Vojtech Krasa
*/
public class CppCodeFormatterFacade extends CodeFormatterFacade {
protected CodeFormatter codeFormatter;
private CppPropertiesProvider propertiesProvider;
protected ModifiableFile.Monitor modifiedMonitor;
public CppCodeFormatterFacade(CppPropertiesProvider propertiesProvider) {
this.propertiesProvider = propertiesProvider;
}
private CodeFormatter getCodeFormatter() throws FileDoesNotExistsException {
if (codeFormatter == null || propertiesProvider.wasChanged(modifiedMonitor)) {
return newCodeFormatter();
}
return codeFormatter;
}
private CodeFormatter newCodeFormatter() throws InvalidPropertyFile {
modifiedMonitor = propertiesProvider.getModifiedMonitor();
codeFormatter = ToolFactory.createDefaultCodeFormatter(toMap(propertiesProvider.get()));
return codeFormatter;
}
@Override
public String format(String text, int startOffset, int endOffset, PsiFile psiFile)
throws FileDoesNotExistsException {
IDocument doc = new Document();
try {
// format the file (the meat and potatoes)
doc.set(text);
TextEdit edit = getCodeFormatter().format(CodeFormatter.K_UNKNOWN, text, startOffset,
endOffset - startOffset, 0, Settings.LINE_SEPARATOR);
if (edit != null) {
edit.apply(doc);
} else {
throw new FormattingFailedException();
}
return doc.get();
} catch (BadLocationException e) {
throw new RuntimeException(e);
}
}
}