| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.intellij.application.options; |
| |
| import com.intellij.application.options.codeStyle.RightMarginForm; |
| import com.intellij.ide.highlighter.XmlHighlighterFactory; |
| import com.intellij.openapi.editor.colors.EditorColorsScheme; |
| import com.intellij.openapi.editor.highlighter.EditorHighlighter; |
| import com.intellij.openapi.fileTypes.FileType; |
| import com.intellij.openapi.fileTypes.StdFileTypes; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.codeStyle.CodeStyleSettings; |
| import com.intellij.psi.codeStyle.CommonCodeStyleSettings; |
| import com.intellij.psi.formatter.xml.XmlCodeStyleSettings; |
| import com.intellij.ui.components.JBScrollPane; |
| import org.apache.xmlbeans.XmlLanguage; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| |
| public class CodeStyleXmlPanel extends CodeStyleAbstractPanel{ |
| private JTextField myKeepBlankLines; |
| private JComboBox myWrapAttributes; |
| private JCheckBox myAlignAttributes; |
| private JCheckBox myKeepWhiteSpaces; |
| |
| private JPanel myPanel; |
| private JPanel myPreviewPanel; |
| |
| private JCheckBox mySpacesAroundEquality; |
| private JCheckBox mySpacesAfterTagName; |
| private JCheckBox myKeepLineBreaks; |
| private JCheckBox myInEmptyTag; |
| private JCheckBox myWrapText; |
| private JCheckBox myKeepLineBreaksInText; |
| private JComboBox myWhiteSpaceAroundCDATA; |
| private JCheckBox myKeepWhitespaceInsideCDATACheckBox; |
| private JBScrollPane myJBScrollPane; |
| private JPanel myRightMarginPanel; |
| private RightMarginForm myRightMarginForm; |
| |
| public CodeStyleXmlPanel(CodeStyleSettings settings) { |
| super(settings); |
| installPreviewPanel(myPreviewPanel); |
| |
| fillWrappingCombo(myWrapAttributes); |
| |
| addPanelToWatch(myPanel); |
| } |
| |
| @Override |
| protected EditorHighlighter createHighlighter(final EditorColorsScheme scheme) { |
| return XmlHighlighterFactory.createXMLHighlighter(scheme); |
| } |
| |
| @Override |
| protected int getRightMargin() { |
| return 60; |
| } |
| |
| @Override |
| public void apply(CodeStyleSettings settings) { |
| XmlCodeStyleSettings xmlSettings = settings.getCustomSettings(XmlCodeStyleSettings.class); |
| xmlSettings.XML_KEEP_BLANK_LINES = getIntValue(myKeepBlankLines); |
| xmlSettings.XML_KEEP_LINE_BREAKS = myKeepLineBreaks.isSelected(); |
| xmlSettings.XML_KEEP_LINE_BREAKS_IN_TEXT = myKeepLineBreaksInText.isSelected(); |
| xmlSettings.XML_ATTRIBUTE_WRAP = ourWrappings[myWrapAttributes.getSelectedIndex()]; |
| xmlSettings.XML_TEXT_WRAP = myWrapText.isSelected() ? CommonCodeStyleSettings.WRAP_AS_NEEDED : CommonCodeStyleSettings.DO_NOT_WRAP; |
| xmlSettings.XML_ALIGN_ATTRIBUTES = myAlignAttributes.isSelected(); |
| xmlSettings.XML_KEEP_WHITESPACES = myKeepWhiteSpaces.isSelected(); |
| xmlSettings.XML_SPACE_AROUND_EQUALITY_IN_ATTRIBUTE = mySpacesAroundEquality.isSelected(); |
| xmlSettings.XML_SPACE_AFTER_TAG_NAME = mySpacesAfterTagName.isSelected(); |
| xmlSettings.XML_SPACE_INSIDE_EMPTY_TAG = myInEmptyTag.isSelected(); |
| xmlSettings.XML_WHITE_SPACE_AROUND_CDATA = myWhiteSpaceAroundCDATA.getSelectedIndex(); |
| xmlSettings.XML_KEEP_WHITE_SPACES_INSIDE_CDATA = myKeepWhitespaceInsideCDATACheckBox.isSelected(); |
| myRightMarginForm.apply(settings); |
| } |
| |
| private int getIntValue(JTextField keepBlankLines) { |
| try { |
| return Integer.parseInt(keepBlankLines.getText()); |
| } |
| catch (NumberFormatException e) { |
| return 0; |
| } |
| } |
| |
| @Override |
| protected void resetImpl(final CodeStyleSettings settings) { |
| XmlCodeStyleSettings xmlSettings = settings.getCustomSettings(XmlCodeStyleSettings.class); |
| myKeepBlankLines.setText(String.valueOf(xmlSettings.XML_KEEP_BLANK_LINES)); |
| myWrapAttributes.setSelectedIndex(getIndexForWrapping(xmlSettings.XML_ATTRIBUTE_WRAP)); |
| myAlignAttributes.setSelected(xmlSettings.XML_ALIGN_ATTRIBUTES); |
| myKeepWhiteSpaces.setSelected(xmlSettings.XML_KEEP_WHITESPACES); |
| mySpacesAfterTagName.setSelected(xmlSettings.XML_SPACE_AFTER_TAG_NAME); |
| mySpacesAroundEquality.setSelected(xmlSettings.XML_SPACE_AROUND_EQUALITY_IN_ATTRIBUTE); |
| myKeepLineBreaks.setSelected(xmlSettings.XML_KEEP_LINE_BREAKS); |
| myKeepLineBreaksInText.setSelected(xmlSettings.XML_KEEP_LINE_BREAKS_IN_TEXT); |
| myInEmptyTag.setSelected(xmlSettings.XML_SPACE_INSIDE_EMPTY_TAG); |
| myWrapText.setSelected(wrapText(settings)); |
| myWhiteSpaceAroundCDATA.setSelectedIndex(xmlSettings.XML_WHITE_SPACE_AROUND_CDATA); |
| myKeepWhitespaceInsideCDATACheckBox.setSelected(xmlSettings.XML_KEEP_WHITE_SPACES_INSIDE_CDATA); |
| myRightMarginForm.reset(settings); |
| } |
| |
| @Override |
| public boolean isModified(CodeStyleSettings settings) { |
| XmlCodeStyleSettings xmlSettings = settings.getCustomSettings(XmlCodeStyleSettings.class); |
| if (myWrapText.isSelected() != wrapText(settings)) { |
| return true; |
| } |
| if (xmlSettings.XML_KEEP_BLANK_LINES != getIntValue(myKeepBlankLines)) { |
| return true; |
| } |
| if (xmlSettings.XML_ATTRIBUTE_WRAP != ourWrappings[myWrapAttributes.getSelectedIndex()]) { |
| return true; |
| } |
| if (xmlSettings.XML_ALIGN_ATTRIBUTES != myAlignAttributes.isSelected()) { |
| return true; |
| } |
| if (xmlSettings.XML_KEEP_WHITESPACES != myKeepWhiteSpaces.isSelected()) { |
| return true; |
| } |
| |
| if (xmlSettings.XML_SPACE_AROUND_EQUALITY_IN_ATTRIBUTE != mySpacesAroundEquality.isSelected()){ |
| return true; |
| } |
| |
| if (xmlSettings.XML_SPACE_AFTER_TAG_NAME != mySpacesAfterTagName.isSelected()){ |
| return true; |
| } |
| |
| if (xmlSettings.XML_KEEP_LINE_BREAKS != myKeepLineBreaks.isSelected()) { |
| return true; |
| } |
| |
| if (xmlSettings.XML_KEEP_LINE_BREAKS_IN_TEXT != myKeepLineBreaksInText.isSelected()) { |
| return true; |
| } |
| |
| if (xmlSettings.XML_SPACE_INSIDE_EMPTY_TAG != myInEmptyTag.isSelected()){ |
| return true; |
| } |
| if (xmlSettings.XML_WHITE_SPACE_AROUND_CDATA != myWhiteSpaceAroundCDATA.getSelectedIndex()) { |
| return true; |
| } |
| if (xmlSettings.XML_KEEP_WHITE_SPACES_INSIDE_CDATA != this.myKeepWhitespaceInsideCDATACheckBox.isSelected()) { |
| return true; |
| } |
| |
| return myRightMarginForm.isModified(settings); |
| } |
| |
| private boolean wrapText(final CodeStyleSettings settings) { |
| XmlCodeStyleSettings xmlSettings = settings.getCustomSettings(XmlCodeStyleSettings.class); |
| return xmlSettings.XML_TEXT_WRAP == CommonCodeStyleSettings.WRAP_AS_NEEDED; |
| } |
| |
| @Override |
| public JComponent getPanel() { |
| return myPanel; |
| } |
| |
| @Override |
| protected String getPreviewText() { |
| return readFromFile(getClass(), "preview.xml.template"); |
| } |
| |
| @Override |
| @NotNull |
| protected FileType getFileType() { |
| return StdFileTypes.XML; |
| } |
| |
| @Override |
| protected void prepareForReformat(final PsiFile psiFile) { |
| //psiFile.putUserData(PsiUtil.FILE_LANGUAGE_LEVEL_KEY, LanguageLevel.HIGHEST); |
| } |
| |
| private void createUIComponents() { |
| myJBScrollPane = new JBScrollPane() { |
| @Override |
| public Dimension getPreferredSize() { |
| Dimension prefSize = super.getPreferredSize(); |
| return new Dimension(prefSize.width + 15, prefSize.height); |
| } |
| }; |
| myRightMarginForm = new RightMarginForm(StdFileTypes.XML.getLanguage(), getSettings()); |
| myRightMarginPanel = myRightMarginForm.getTopPanel(); |
| } |
| } |