package com.redhat.ceylon.eclipse.code.style;
import java.io.File;
import java.io.IOException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentExtension4;
import ceylon.formatter.options.LineBreak;
import ceylon.formatter.options.Spaces;
import ceylon.formatter.options.SparseFormattingOptions;
import ceylon.formatter.options.Tabs;
import ceylon.formatter.options.VariableOptions;
import ceylon.formatter.options.crlf_;
import ceylon.formatter.options.lf_;
import ceylon.formatter.options.os_;
import ceylon.formatter.options.saveProfile_;
import com.redhat.ceylon.common.config.CeylonConfig;
import com.redhat.ceylon.common.config.ConfigWriter;
import com.redhat.ceylon.eclipse.code.style.FormatterProfileManager.Profile;
import com.redhat.ceylon.eclipse.ui.CeylonPlugin;
import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.utilJ2C;
import static com.redhat.ceylon.eclipse.code.style.CeylonFormatterConstants.*;
/**
* Utility query and update for style options
*
*/
public class CeylonStyle {
private CeylonStyle() {
// only static methods
}
private static final String PREF_STYLE_FORMATTER_PROFILE = "formattool.profile";
public static String getFormatterProfile(IProject project) {
CeylonConfig config = CeylonConfig.createFromLocalDir(project
.getLocation().toFile());
if (config != null
&& config.isOptionDefined(PREF_STYLE_FORMATTER_PROFILE)) {
return config.getOption(PREF_STYLE_FORMATTER_PROFILE);
} else {
return DEFAULT_PROFILE_NAME;
}
}
public static boolean setFormatterProfile(IProject project, String name) {
CeylonConfig options = CeylonConfig.createFromLocalDir(project
.getLocation().toFile());
options.setOption(PREF_STYLE_FORMATTER_PROFILE, name);
return writeProjectConfig(project, options);
}
public static void writeProfileToFile(Profile profile, File file)
throws CoreException {
try {
saveProfile_.saveProfile(
profile.getSettings(),
profile.getName(),
file.isDirectory() ? file.getAbsolutePath() : file
.getParent());
} catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR,
CeylonPlugin.PLUGIN_ID, e.getMessage()));
}
}
/**
* Creates {@link SparseFormattingOptions} that respect whitespace-relevant
* settings:
* <ul>
* <li>{@link SparseFormattingOptions#getIndentMode() indentMode} from
* spaces-for-tabs and editor-tab-width</li>
* <li>{@link SparseFormattingOptions#getLineBreak() lineBreak} from
* document newline character</li>
* </ul>
*/
public static SparseFormattingOptions getEclipseWsOptions(IDocument document) {
LineBreak lb;
if (document instanceof IDocumentExtension4) {
switch (((IDocumentExtension4) document).getDefaultLineDelimiter()) {
case "\n":
lb = lf_.get_();
break;
case "\r\n":
lb = crlf_.get_();
break;
default:
lb = os_.get_();
break;
}
} else {
lb = os_.get_();
}
VariableOptions ret = new VariableOptions(new SparseFormattingOptions());
ret.setIndentMode(utilJ2C().indents().getIndentWithSpaces() ?
new Spaces(utilJ2C().indents().getIndentSpaces()) :
new Tabs(utilJ2C().indents().getIndentSpaces()));
ret.setLineBreak(lb);
return ret;
}
private static boolean writeProjectConfig(IProject project,
CeylonConfig options) {
if (project != null) {
try {
ConfigWriter.instance().write(options, new File(project.getLocation()
.toFile(), ".ceylon/config"));
return true;
} catch (IOException e) {
CeylonPlugin.getInstance().getLog()
.log(new Status(IStatus.ERROR,
CeylonPlugin.PLUGIN_ID, e.getMessage()));
return false;
}
} else {
return false;
}
}
}