/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.formatting;
import com.intellij.application.options.IndentOptionsEditor;
import com.intellij.application.options.SmartIndentOptionsEditor;
import com.intellij.lang.Language;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.project.Project;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import com.intellij.psi.codeStyle.CodeStyleSettingsCustomizable;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.LocalTimeCounter;
import gw.plugin.ij.filetypes.GosuCodeFileType;
import gw.plugin.ij.formatting.samples.GosuCodeSamples;
import gw.plugin.ij.lang.GosuLanguage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import static com.intellij.openapi.application.ApplicationBundle.*;
public class GosuLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider {
@NotNull
@Override
public Language getLanguage() {
return GosuLanguage.instance();
}
public boolean usesSharedPreview() {
return false;
}
@Override
public CommonCodeStyleSettings getDefaultCommonSettings() {
final CommonCodeStyleSettings settings = new CommonCodeStyleSettings(GosuLanguage.instance());
final CodeStyleSettings.IndentOptions options = settings.initIndentOptions();
options.INDENT_SIZE = 2;
options.TAB_SIZE = 2;
options.USE_TAB_CHARACTER = false;
options.CONTINUATION_INDENT_SIZE = 4;
return settings;
}
@Nullable
@Override
public String getCodeSample(@NotNull SettingsType settingsType) {
switch (settingsType) {
case INDENT_SETTINGS:
case SPACING_SETTINGS:
return GosuCodeSamples.SPACING_SAMPLE;
case WRAPPING_AND_BRACES_SETTINGS:
return GosuCodeSamples.WRAPPING_AND_BRACES_SAMPLE;
case BLANK_LINES_SETTINGS:
return GosuCodeSamples.BLANK_LINES_SAMPLE;
}
return null;
}
@Override
public int getRightMargin(@NotNull SettingsType settingsType) {
if (settingsType == SettingsType.WRAPPING_AND_BRACES_SETTINGS) {
return 37;
}
return super.getRightMargin(settingsType);
}
protected void customizeSpacingSettigs(@NotNull CodeStyleSettingsCustomizable consumer) {
consumer.showStandardOptions(
// SPACES_BEFORE_PARENTHESES
"SPACE_BEFORE_METHOD_PARENTHESES",
"SPACE_BEFORE_METHOD_CALL_PARENTHESES",
"SPACE_BEFORE_IF_PARENTHESES",
"SPACE_BEFORE_FOR_PARENTHESES",
"SPACE_BEFORE_WHILE_PARENTHESES",
"SPACE_BEFORE_SWITCH_PARENTHESES",
//"SPACE_BEFORE_TRY_PARENTHESES",
"SPACE_BEFORE_CATCH_PARENTHESES",
//"SPACE_BEFORE_SYNCHRONIZED_PARENTHESES",
"SPACE_BEFORE_ANOTATION_PARAMETER_LIST",
// SPACES_AROUND_OPERATORS
"SPACE_AROUND_ASSIGNMENT_OPERATORS",
"SPACE_AROUND_LOGICAL_OPERATORS",
"SPACE_AROUND_EQUALITY_OPERATORS",
"SPACE_AROUND_RELATIONAL_OPERATORS",
"SPACE_AROUND_BITWISE_OPERATORS",
"SPACE_AROUND_ADDITIVE_OPERATORS",
"SPACE_AROUND_MULTIPLICATIVE_OPERATORS",
"SPACE_AROUND_SHIFT_OPERATORS",
"SPACE_AROUND_UNARY_OPERATOR",
// SPACES_BEFORE_LEFT_BRACE
"SPACE_BEFORE_CLASS_LBRACE",
"SPACE_BEFORE_METHOD_LBRACE",
"SPACE_BEFORE_IF_LBRACE",
"SPACE_BEFORE_ELSE_LBRACE",
"SPACE_BEFORE_FOR_LBRACE",
"SPACE_BEFORE_WHILE_LBRACE",
"SPACE_BEFORE_DO_LBRACE",
"SPACE_BEFORE_SWITCH_LBRACE",
"SPACE_BEFORE_TRY_LBRACE",
"SPACE_BEFORE_CATCH_LBRACE",
"SPACE_BEFORE_FINALLY_LBRACE",
//"SPACE_BEFORE_SYNCHRONIZED_LBRACE",
"SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE",
"SPACE_BEFORE_ANNOTATION_ARRAY_INITIALIZER_LBRACE",
// SPACES_BEFORE_KEYWORD
"SPACE_BEFORE_ELSE_KEYWORD",
"SPACE_BEFORE_WHILE_KEYWORD",
"SPACE_BEFORE_CATCH_KEYWORD",
"SPACE_BEFORE_FINALLY_KEYWORD",
// SPACES_WITHIN
"SPACE_WITHIN_BRACES",
"SPACE_WITHIN_BRACKETS",
"SPACE_WITHIN_ARRAY_INITIALIZER_BRACES",
"SPACE_WITHIN_PARENTHESES",
"SPACE_WITHIN_METHOD_CALL_PARENTHESES",
"SPACE_WITHIN_METHOD_PARENTHESES",
"SPACE_WITHIN_IF_PARENTHESES",
"SPACE_WITHIN_FOR_PARENTHESES",
"SPACE_WITHIN_WHILE_PARENTHESES",
"SPACE_WITHIN_SWITCH_PARENTHESES",
//"SPACE_WITHIN_TRY_PARENTHESES",
"SPACE_WITHIN_CATCH_PARENTHESES",
//"SPACE_WITHIN_SYNCHRONIZED_PARENTHESES",
"SPACE_WITHIN_CAST_PARENTHESES",
"SPACE_WITHIN_ANNOTATION_PARENTHESES",
// SPACES_IN_TERNARY_OPERATOR
"SPACE_BEFORE_QUEST",
"SPACE_AFTER_QUEST",
"SPACE_BEFORE_COLON",
"SPACE_AFTER_COLON",
// SPACES_WITHIN_TYPE_ARGUMENTS
"SPACE_AFTER_COMMA_IN_TYPE_ARGUMENTS",
// SPACES_OTHER
"SPACE_BEFORE_COMMA",
"SPACE_AFTER_COMMA",
//"SPACE_BEFORE_SEMICOLON",
//"SPACE_AFTER_SEMICOLON",
"SPACE_AFTER_TYPE_CAST"
);
// Around operators
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_AROUND_INTERVAL_OPERATORS",
"Interval operators (.., |.., ..|, |..|)",
CodeStyleSettingsCustomizable.SPACES_AROUND_OPERATORS);
// Before parentheses
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_BEFORE_TYPEOF_PARENTHESES",
"'typeof' parentheses",
CodeStyleSettingsCustomizable.SPACES_BEFORE_PARENTHESES);
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_BEFORE_USING_PARENTHESES",
"'using' parentheses",
CodeStyleSettingsCustomizable.SPACES_BEFORE_PARENTHESES);
// Withing parentheses
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_WITHIN_TYPEOF_PARENTHESES",
"'typeof' parentheses",
CodeStyleSettingsCustomizable.SPACES_WITHIN);
// Before left brace
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_BEFORE_USING_LBRACE",
"'using' left brace",
CodeStyleSettingsCustomizable.SPACES_BEFORE_LEFT_BRACE);
// Other
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_BEFORE_COLON",
"Before colon",
CodeStyleSettingsCustomizable.SPACES_OTHER);
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_AFTER_COLON",
"After colon",
CodeStyleSettingsCustomizable.SPACES_OTHER);
// Blocks
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_AFTER_LAMBDA",
"Blocks: After \\",
CodeStyleSettingsCustomizable.SPACES_OTHER);
consumer.showCustomOption(GosuCodeStyleSettings.class,
"SPACE_AROUND_ARROW",
"Blocks: Around ->",
CodeStyleSettingsCustomizable.SPACES_OTHER);
}
protected void customizeWrappingAndBracesSettings(@NotNull CodeStyleSettingsCustomizable consumer) {
consumer.showStandardOptions(
"KEEP_LINE_BREAKS"
// "KEEP_FIRST_COLUMN_COMMENT",
// "KEEP_CONTROL_STATEMENT_IN_ONE_LINE",
// "KEEP_MULTIPLE_EXPRESSIONS_IN_ONE_LINE"
// "KEEP_SIMPLE_BLOCKS_IN_ONE_LINE",
// "KEEP_SIMPLE_METHODS_IN_ONE_LINE",
// "KEEP_SIMPLE_CLASSES_IN_ONE_LINE",
//
// "WRAP_LONG_LINES",
//
// "CLASS_BRACE_STYLE",
// "METHOD_BRACE_STYLE",
// "BRACE_STYLE",
//
// "EXTENDS_LIST_WRAP",
// "ALIGN_MULTILINE_EXTENDS_LIST",
//
// "EXTENDS_KEYWORD_WRAP",
//
// "THROWS_LIST_WRAP",
// "ALIGN_MULTILINE_THROWS_LIST",
// "ALIGN_THROWS_KEYWORD",
// "THROWS_KEYWORD_WRAP",
//
// "METHOD_PARAMETERS_WRAP",
// "ALIGN_MULTILINE_PARAMETERS",
// "METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE",
// "METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE",
//
// "CALL_PARAMETERS_WRAP",
// "ALIGN_MULTILINE_PARAMETERS_IN_CALLS",
// "PREFER_PARAMETERS_WRAP",
// "CALL_PARAMETERS_LPAREN_ON_NEXT_LINE",
// "CALL_PARAMETERS_RPAREN_ON_NEXT_LINE",
//
// "ALIGN_MULTILINE_METHOD_BRACKETS",
//
// "METHOD_CALL_CHAIN_WRAP",
// "ALIGN_MULTILINE_CHAINED_METHODS",
//
// "ALIGN_GROUP_FIELD_DECLARATIONS",
//
// "IF_BRACE_FORCE",
// "ELSE_ON_NEW_LINE",
// "SPECIAL_ELSE_IF_TREATMENT",
//
// "FOR_STATEMENT_WRAP",
// "ALIGN_MULTILINE_FOR",
// "FOR_STATEMENT_LPAREN_ON_NEXT_LINE",
// "FOR_STATEMENT_RPAREN_ON_NEXT_LINE",
// "FOR_BRACE_FORCE",
//
// "WHILE_BRACE_FORCE",
// "DOWHILE_BRACE_FORCE",
// "WHILE_ON_NEW_LINE",
//
// "INDENT_CASE_FROM_SWITCH",
//
// "RESOURCE_LIST_WRAP",
// "ALIGN_MULTILINE_RESOURCES",
// "RESOURCE_LIST_LPAREN_ON_NEXT_LINE",
// "RESOURCE_LIST_RPAREN_ON_NEXT_LINE",
//
// "CATCH_ON_NEW_LINE",
// "FINALLY_ON_NEW_LINE",
//
// "BINARY_OPERATION_WRAP",
// "ALIGN_MULTILINE_BINARY_OPERATION",
// "BINARY_OPERATION_SIGN_ON_NEXT_LINE",
// "ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION",
// "PARENTHESES_EXPRESSION_LPAREN_WRAP",
// "PARENTHESES_EXPRESSION_RPAREN_WRAP",
//
// "ASSIGNMENT_WRAP",
// "ALIGN_MULTILINE_ASSIGNMENT",
// "PLACE_ASSIGNMENT_SIGN_ON_NEXT_LINE",
//
// "TERNARY_OPERATION_WRAP",
// "ALIGN_MULTILINE_TERNARY_OPERATION",
// "TERNARY_OPERATION_SIGNS_ON_NEXT_LINE",
//
// "ARRAY_INITIALIZER_WRAP",
// "ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION",
// "ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE",
// "ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE",
//
// "MODIFIER_LIST_WRAP",
//
// "ASSERT_STATEMENT_WRAP",
// "ASSERT_STATEMENT_COLON_ON_NEXT_LINE",
//
// "CLASS_ANNOTATION_WRAP",
// "METHOD_ANNOTATION_WRAP",
// "FIELD_ANNOTATION_WRAP",
// "PARAMETER_ANNOTATION_WRAP",
// "VARIABLE_ANNOTATION_WRAP",
// "ENUM_CONSTANTS_WRAP"
);
}
protected void customizeBlankLinesSettings(@NotNull CodeStyleSettingsCustomizable consumer) {
consumer.showAllStandardOptions();
}
@Override
public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer, @NotNull SettingsType settingsType) {
switch (settingsType) {
case SPACING_SETTINGS:
customizeSpacingSettigs(consumer);
break;
case WRAPPING_AND_BRACES_SETTINGS:
customizeWrappingAndBracesSettings(consumer);
break;
case BLANK_LINES_SETTINGS:
customizeBlankLinesSettings(consumer);
break;
}
}
public static final String FORMATTING_FILE_NAME = "a.gs";
@Override
public PsiFile createFileFromText(final Project project, @NotNull final String text) {
final PsiFile file = PsiFileFactory.getInstance(project).createFileFromText(
FORMATTING_FILE_NAME, GosuCodeFileType.INSTANCE, text, LocalTimeCounter.currentTime(), true, false);
file.putUserData(PsiUtil.FILE_LANGUAGE_LEVEL_KEY, LanguageLevel.HIGHEST);
return file;
}
@Override
public IndentOptionsEditor getIndentOptionsEditor() {
return new SmartIndentOptionsEditor() {
private JTextField myLabelIndent;
private JLabel myLabelIndentLabel;
private JCheckBox myLabelIndentAbsolute;
protected void addComponents() {
super.addComponents();
myLabelIndent = new JTextField(4);
add(myLabelIndentLabel = new JLabel(message("editbox.indent.label.indent")), myLabelIndent);
myLabelIndentAbsolute = new JCheckBox(message("checkbox.indent.absolute.label.indent"));
add(myLabelIndentAbsolute, true);
}
public boolean isModified(final CodeStyleSettings settings, @NotNull final CommonCodeStyleSettings.IndentOptions options) {
boolean isModified = super.isModified(settings, options);
isModified |= isFieldModified(myLabelIndent, options.LABEL_INDENT_SIZE);
isModified |= isFieldModified(myLabelIndentAbsolute, options.LABEL_INDENT_ABSOLUTE);
return isModified;
}
public void apply(final CodeStyleSettings settings, @NotNull final CommonCodeStyleSettings.IndentOptions options) {
super.apply(settings, options);
options.LABEL_INDENT_SIZE = getFieldValue(myLabelIndent, Integer.MIN_VALUE, options.LABEL_INDENT_SIZE);
options.LABEL_INDENT_ABSOLUTE = myLabelIndentAbsolute.isSelected();
}
public void reset(@NotNull final CodeStyleSettings settings, @NotNull final CommonCodeStyleSettings.IndentOptions options) {
super.reset(settings, options);
myLabelIndent.setText(Integer.toString(options.LABEL_INDENT_SIZE));
myLabelIndentAbsolute.setSelected(options.LABEL_INDENT_ABSOLUTE);
}
public void setEnabled(final boolean enabled) {
super.setEnabled(enabled);
myLabelIndent.setEnabled(enabled);
myLabelIndentLabel.setEnabled(enabled);
myLabelIndentAbsolute.setEnabled(enabled);
}
};
}
}