package com.dmarcotte.handlebars.pages; import com.dmarcotte.handlebars.HbBundle; import com.dmarcotte.handlebars.HbLanguage; import com.dmarcotte.handlebars.config.HbConfig; import com.intellij.lang.Language; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.ex.FileTypeManagerEx; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.psi.templateLanguages.TemplateDataLanguageMappings; import com.intellij.ui.ListCellRendererWrapper; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.Collections; import java.util.List; public class HbConfigurationPage implements SearchableConfigurable { private JCheckBox myAutoGenerateClosingTagCheckBox; private JPanel myWholePanel; private JCheckBox myFormattingCheckBox; private JComboBox myCommenterLanguage; private JCheckBox myAutocompleteMustaches; private JCheckBox htmlAsHb; private Project myProject; public HbConfigurationPage(Project project) { myProject = project; } @NotNull @Override public String getId() { return "editor.preferences.handlebarsOptions"; } @Nls @Override public String getDisplayName() { return HbBundle.message("hb.pages.options.title"); } @SuppressWarnings({"UnusedDeclaration", "SameReturnValue"}) // this can probably be deleted eventually; IDEA 11 expects it to be here public Icon getIcon() { return null; } @Override public String getHelpTopic() { return "reference.settings.ide.settings.handlebars.mustache"; } @Override public JComponent createComponent() { return myWholePanel; } @Override public boolean isModified() { return myAutoGenerateClosingTagCheckBox.isSelected() != HbConfig.isAutoGenerateCloseTagEnabled() || myAutocompleteMustaches.isSelected() != HbConfig.isAutocompleteMustachesEnabled() || myFormattingCheckBox.isSelected() != HbConfig.isFormattingEnabled() || htmlAsHb.isSelected() != HbConfig.shouldOpenHtmlAsHandlebars(myProject) || !HbConfig.getCommenterLanguage().getID().equals(getSelectedLanguageId()); } private String getSelectedLanguageId() { final Object item = myCommenterLanguage.getSelectedItem(); return item == null ? null : ((Language)item).getID(); } @Override public void apply() throws ConfigurationException { HbConfig.setAutoGenerateCloseTagEnabled(myAutoGenerateClosingTagCheckBox.isSelected()); HbConfig.setAutocompleteMustachesEnabled(myAutocompleteMustaches.isSelected()); HbConfig.setFormattingEnabled(myFormattingCheckBox.isSelected()); HbConfig.setCommenterLanguage((Language)myCommenterLanguage.getSelectedItem()); if (HbConfig.setShouldOpenHtmlAsHandlebars(htmlAsHb.isSelected(), myProject)) { ApplicationManager.getApplication().runWriteAction(() -> FileTypeManagerEx.getInstanceEx().fireFileTypesChanged()); } } @Override public void reset() { myAutoGenerateClosingTagCheckBox.setSelected(HbConfig.isAutoGenerateCloseTagEnabled()); myAutocompleteMustaches.setSelected(HbConfig.isAutocompleteMustachesEnabled()); myFormattingCheckBox.setSelected(HbConfig.isFormattingEnabled()); htmlAsHb.setSelected(HbConfig.shouldOpenHtmlAsHandlebars(myProject)); resetCommentLanguageCombo(HbConfig.getCommenterLanguage()); } private void resetCommentLanguageCombo(@NotNull Language commentLanguage) { final DefaultComboBoxModel model = (DefaultComboBoxModel)myCommenterLanguage.getModel(); final List<Language> languages = TemplateDataLanguageMappings.getTemplateableLanguages(); // add using the native Handlebars commenter as an option languages.add(HbLanguage.INSTANCE); Collections.sort(languages, (o1, o2) -> o1.getID().compareTo(o2.getID())); for (Language language : languages) { model.addElement(language); } myCommenterLanguage.setRenderer(new ListCellRendererWrapper() { @Override public void customize(JList list, Object value, int index, boolean selected, boolean hasFocus) { setText(value == null ? "" : ((Language)value).getDisplayName()); if (value != null) { final FileType type = ((Language)value).getAssociatedFileType(); if (type != null) { setIcon(type.getIcon()); } } } }); myCommenterLanguage.setSelectedItem(commentLanguage); } }