From a4efddbaf3f36ee26927742bc0197b91661199d5 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Mon, 14 Mar 2011 13:30:29 +0100 Subject: [PATCH] Allow to customize sample file creation for code style settings panel --- .../LanguageCodeStyleSettingsProvider.java | 72 ++++++++++--------- .../options/CodeStyleAbstractPanel.java | 16 ++--- .../MultilanguageCodeStyleAbstractPanel.java | 9 ++- 3 files changed, 54 insertions(+), 43 deletions(-) diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java b/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java index 9701e2a24eae..9d17d9faa69b 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/LanguageCodeStyleSettingsProvider.java @@ -18,6 +18,8 @@ package com.intellij.psi.codeStyle; import com.intellij.lang.Language; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -66,11 +68,22 @@ public abstract class LanguageCodeStyleSettingsProvider { return null; } + /** + * Allows to customize PSI file creation for a language settings preview panel. + * + * @param project current project + * @param text code sample to demonstrate formatting settings (see {@link #getCodeSample(LanguageCodeStyleSettingsProvider.SettingsType)} + * @return a PSI file instance with given text, or null for use + */ + @Nullable + public PsiFile createFileFromText(final Project project, final String text) { + return null; + } + /** * Creates an instance of CommonCodeStyleSettings and sets initial default values for those * settings which differ from the original. * - * @param settings Main settings containing the common code style settings. * @return Created instance of CommonCodeStyleSettings or null if associated language doesn't * use its own language-specific common settings (the settings are shared with other languages). */ @@ -81,30 +94,22 @@ public abstract class LanguageCodeStyleSettingsProvider { @NotNull public static Language[] getLanguagesWithCodeStyleSettings() { - ArrayList langs = new ArrayList(); + final ArrayList languages = new ArrayList(); for (LanguageCodeStyleSettingsProvider provider : Extensions.getExtensions(EP_NAME)) { - langs.add(provider.getLanguage()); + languages.add(provider.getLanguage()); } - return langs.toArray(new Language[langs.size()]); + return languages.toArray(new Language[languages.size()]); } @Nullable public static String getCodeSample(Language lang, @NotNull SettingsType settingsType) { - for (LanguageCodeStyleSettingsProvider provider : Extensions.getExtensions(EP_NAME)) { - if (provider.getLanguage().equals(lang)) { - return provider.getCodeSample(settingsType); - } - } - return null; + final LanguageCodeStyleSettingsProvider provider = forLanguage(lang); + return provider != null ? provider.getCodeSample(settingsType) : null; } public static int getRightMargin(Language lang, @NotNull SettingsType settingsType) { - for (LanguageCodeStyleSettingsProvider provider : Extensions.getExtensions(EP_NAME)) { - if (provider.getLanguage().equals(lang)) { - return provider.getRightMargin(settingsType); - } - } - return -1; + final LanguageCodeStyleSettingsProvider provider = forLanguage(lang); + return provider != null ? provider.getRightMargin(settingsType) : -1; } @Nullable @@ -121,32 +126,35 @@ public abstract class LanguageCodeStyleSettingsProvider { @Nullable public static CommonCodeStyleSettings getDefaultCommonSettings(Language lang) { - for (LanguageCodeStyleSettingsProvider provider : Extensions.getExtensions(EP_NAME)) { - if (provider.getLanguage().equals(lang)) { - return provider.getDefaultCommonSettings(); - } - } - return null; + final LanguageCodeStyleSettingsProvider provider = forLanguage(lang); + return provider != null ? provider.getDefaultCommonSettings() : null; } @Nullable public static String getFileExt(Language lang) { - for (LanguageCodeStyleSettingsProvider provider : Extensions.getExtensions(EP_NAME)) { - if (provider.getLanguage().equals(lang)) { - return provider.getFileExt(); - } - } - return null; + final LanguageCodeStyleSettingsProvider provider = forLanguage(lang); + return provider != null ? provider.getFileExt() : null; } @Nullable public static String getLanguageName(Language lang) { + final LanguageCodeStyleSettingsProvider provider = forLanguage(lang); + return provider != null ? provider.getLanguageName() : null; + } + + @Nullable + public static PsiFile createFileFromText(final Language language, final Project project, final String text) { + final LanguageCodeStyleSettingsProvider provider = forLanguage(language); + return provider != null ? provider.createFileFromText(project, text) : null; + } + + @Nullable + public static LanguageCodeStyleSettingsProvider forLanguage(final Language language) { for (LanguageCodeStyleSettingsProvider provider : Extensions.getExtensions(EP_NAME)) { - if (provider.getLanguage().equals(lang)) { - return provider.getLanguageName(); + if (provider.getLanguage().equals(language)) { + return provider; } } return null; - } - + } } diff --git a/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java b/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java index d36696978ebf..47b014ae8f78 100644 --- a/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/CodeStyleAbstractPanel.java @@ -88,14 +88,6 @@ public abstract class CodeStyleAbstractPanel implements Disposable { private boolean myShowsPreviewHighlighters; private boolean mySkipPreviewHighlighting; - private synchronized void setSomethingChanged(final boolean b) { - mySomethingChanged = b; - } - - private synchronized boolean isSomethingChanged() { - return mySomethingChanged; - } - protected CodeStyleAbstractPanel(CodeStyleSettings settings) { mySettings = settings; myEditor = createEditor(); @@ -110,6 +102,14 @@ public abstract class CodeStyleAbstractPanel implements Disposable { updatePreview(); } + private synchronized void setSomethingChanged(final boolean b) { + mySomethingChanged = b; + } + + private synchronized boolean isSomethingChanged() { + return mySomethingChanged; + } + public void setModel(final CodeStyleSchemesModel model) { myModel = model; } diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java index e7dded62aec4..d3ef4ffcb46e 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/MultilanguageCodeStyleAbstractPanel.java @@ -16,9 +16,7 @@ package com.intellij.application.options.codeStyle; import com.intellij.application.options.CodeStyleAbstractPanel; -import com.intellij.ide.DataManager; import com.intellij.lang.Language; -import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; @@ -30,7 +28,6 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleManager; @@ -114,6 +111,12 @@ public abstract class MultilanguageCodeStyleAbstractPanel extends CodeStyleAbstr return sample; } + @Override + protected PsiFile createFileFromText(final Project project, final String text) { + final PsiFile file = LanguageCodeStyleSettingsProvider.createFileFromText(myLanguage, project, text); + return file != null ? file : super.createFileFromText(project, text); + } + @Override protected int getRightMargin() { if (myLanguage == null) return -1;