diff --git a/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/PanelBuilder.kt b/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/PanelBuilder.kt index 6a28a36b3155..0919685e5ea3 100644 --- a/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/PanelBuilder.kt +++ b/platform/platform-impl/src/com/intellij/ui/dsl/builder/impl/PanelBuilder.kt @@ -203,7 +203,7 @@ internal class PanelBuilder(val rows: List, val dialogPanelConfig: Dial // todo visualPaddings val gaps = cell.customGaps ?: Gaps(left = leftGap, right = rightGap) val subGrid = builder.subGrid(width = width, horizontalAlign = cell.horizontalAlign, verticalAlign = cell.verticalAlign, - gaps = gaps) + resizableColumn = cell.resizableColumn, gaps = gaps) val prevSpacingConfiguration = dialogPanelConfig.spacing cell.spacingConfiguration?.let { diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/CopyrightFormattingConfigurable.java b/plugins/copyright/src/com/maddyhome/idea/copyright/ui/CopyrightFormattingConfigurable.java index c48872af66f0..bd8530ce5b5f 100644 --- a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/CopyrightFormattingConfigurable.java +++ b/plugins/copyright/src/com/maddyhome/idea/copyright/ui/CopyrightFormattingConfigurable.java @@ -52,7 +52,7 @@ public class CopyrightFormattingConfigurable extends SearchableConfigurable.Pare private TemplateCommentPanel getOrCreateMainPanel() { if (myPanel == null) { - myPanel = new TemplateCommentPanel(null, null, null, myProject); + myPanel = new TemplateCommentPanel(null, null, myProject); } return myPanel; } diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/FileTypeCopyrightConfigurableFactory.java b/plugins/copyright/src/com/maddyhome/idea/copyright/ui/FileTypeCopyrightConfigurableFactory.java index dbd04142096d..8208e578e10c 100644 --- a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/FileTypeCopyrightConfigurableFactory.java +++ b/plugins/copyright/src/com/maddyhome/idea/copyright/ui/FileTypeCopyrightConfigurableFactory.java @@ -17,17 +17,17 @@ public final class FileTypeCopyrightConfigurableFactory { public static Configurable createFileTypeConfigurable(Project project, FileType fileType, TemplateCommentPanel parentPanel) { if (fileType.equals(StdFileTypes.JAVA)) { - return new TemplateCommentPanel(fileType, parentPanel, new String[] { - CopyrightBundle.message("radio.location.in.file.before.package"), - CopyrightBundle.message("radio.location.in.file.before.imports"), - CopyrightBundle.message("radio.location.in.file.before.class")}, project); + return new TemplateCommentPanel(fileType, parentPanel, project, + CopyrightBundle.message("radio.location.in.file.before.package"), + CopyrightBundle.message("radio.location.in.file.before.imports"), + CopyrightBundle.message("radio.location.in.file.before.class")); } if (fileType.equals(XmlFileType.INSTANCE) || fileType.equals(HtmlFileType.INSTANCE) || fileType.equals(StdFileTypes.JSP) || fileType.equals(StdFileTypes.JSPX)) { - return new TemplateCommentPanel(fileType, parentPanel, new String[]{ - CopyrightBundle.message("radio.location.in.file.before.doctype"), - CopyrightBundle.message("radio.location.in.file.before.root.tag")}, project); + return new TemplateCommentPanel(fileType, parentPanel, project, + CopyrightBundle.message("radio.location.in.file.before.doctype"), + CopyrightBundle.message("radio.location.in.file.before.root.tag")); } - return new TemplateCommentPanel(fileType, parentPanel, null, project); + return new TemplateCommentPanel(fileType, parentPanel, project); } } \ No newline at end of file diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.form b/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.form deleted file mode 100644 index 577b700c7906..000000000000 --- a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.form +++ /dev/null @@ -1,269 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.java b/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.java deleted file mode 100644 index 3b875687600d..000000000000 --- a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.java +++ /dev/null @@ -1,464 +0,0 @@ -// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - -package com.maddyhome.idea.copyright.ui; - -import com.intellij.copyright.CopyrightManager; -import com.intellij.openapi.editor.colors.EditorFontType; -import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.LanguageFileType; -import com.intellij.openapi.fileTypes.StdFileTypes; -import com.intellij.openapi.options.ConfigurationException; -import com.intellij.openapi.options.SearchableConfigurable; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.NlsContexts; -import com.intellij.ui.DocumentAdapter; -import com.intellij.uiDesigner.core.GridConstraints; -import com.intellij.util.ui.UIUtil; -import com.maddyhome.idea.copyright.CopyrightProfileKt; -import com.maddyhome.idea.copyright.CopyrightUpdaters; -import com.maddyhome.idea.copyright.options.LanguageOptions; -import com.maddyhome.idea.copyright.options.Options; -import com.maddyhome.idea.copyright.pattern.EntityUtil; -import com.maddyhome.idea.copyright.pattern.VelocityHelper; -import com.maddyhome.idea.copyright.psi.UpdateCopyrightsProvider; -import com.maddyhome.idea.copyright.util.FileTypeUtil; -import org.jetbrains.annotations.Nls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.EventListenerList; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -public class TemplateCommentPanel implements SearchableConfigurable { - - private final @Nullable FileType fileType; - private final TemplateCommentPanel parentPanel; - private final Project myProject; - private JRadioButton[] fileLocations = null; - - private JTextArea preview; - private JPanel mainPanel; - - private JRadioButton rbBefore; - private JRadioButton rbAfter; - - private JPanel fileLocationPanel; - - private JRadioButton myUseDefaultSettingsRadioButton; - private JRadioButton myUseCustomFormattingOptionsRadioButton; - private JRadioButton myNoCopyright; - - private JRadioButton rbLineComment; - private JCheckBox cbPrefixLines; - private JRadioButton rbBlockComment; - private JPanel myCommentTypePanel; - - private JCheckBox cbSeparatorBefore; - private JTextField txtLengthBefore; - private JTextField txtLengthAfter; - private JCheckBox cbAddBlank; - private JCheckBox cbAddBlankBefore; - private JCheckBox cbSeparatorAfter; - private JCheckBox cbBox; - private JTextField txtFiller; - private JPanel myBorderPanel; - private JLabel lblLengthBefore; - private JLabel lblLengthAfter; - private JLabel mySeparatorCharLabel; - private JPanel myRelativeLocationPanel; - - - private void updateBox() { - boolean enable = true; - if (!cbSeparatorBefore.isSelected() || !cbSeparatorAfter.isSelected()) { - enable = false; - } - else { - if (!txtLengthBefore.getText().equals(txtLengthAfter.getText())) { - enable = false; - } - } - - boolean either = cbSeparatorBefore.isSelected() || cbSeparatorAfter.isSelected(); - - cbBox.setEnabled(enable); - - txtFiller.setEnabled(either); - } - - private final EventListenerList listeners = new EventListenerList(); - private final boolean allowBlock; - - - public TemplateCommentPanel(FileType fileType, TemplateCommentPanel parentPanel, String @NlsContexts.RadioButton [] locations, Project project) { - this.parentPanel = parentPanel; - myProject = project; - - if (fileType == null) { - myUseDefaultSettingsRadioButton.setVisible(false); - myUseCustomFormattingOptionsRadioButton.setVisible(false); - myNoCopyright.setVisible(false); - } - - this.fileType = fileType != null ? fileType : StdFileTypes.JAVA; - allowBlock = FileTypeUtil.hasBlockComment(this.fileType); - - if (parentPanel != null) { - parentPanel.addOptionChangeListener(new TemplateOptionsPanelListener() { - @Override - public void optionChanged() { - updateOverride(); - } - }); - } - - ButtonGroup group = new ButtonGroup(); - group.add(rbBefore); - group.add(rbAfter); - - if (locations == null) { - fileLocationPanel.setBorder(BorderFactory.createEmptyBorder()); - } - else { - fileLocations = new JRadioButton[locations.length]; - group = new ButtonGroup(); - for (int i = 0; i < fileLocations.length; i++) { - fileLocations[i] = new JRadioButton(locations[i]); - group.add(fileLocations[i]); - - fileLocationPanel.add(fileLocations[i], new GridConstraints(i, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, - GridConstraints.SIZEPOLICY_CAN_SHRINK | - GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, - null, null, null)); - } - } - - - addOptionChangeListener(new TemplateOptionsPanelListener() { - @Override - public void optionChanged() { - showPreview(getOptions()); - } - }); - - - preview.setFont(EditorFontType.getGlobalPlainFont()); - - myUseDefaultSettingsRadioButton.setSelected(true); - - final ActionListener listener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - updateOverride(); - } - }; - - myUseDefaultSettingsRadioButton.addActionListener(listener); - myUseCustomFormattingOptionsRadioButton.addActionListener(listener); - myNoCopyright.addActionListener(listener); - txtLengthBefore.setText("80"); - txtLengthAfter.setText("80"); - - rbBlockComment.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - cbPrefixLines.setEnabled(rbBlockComment.isSelected()); - fireChangeEvent(); - } - }); - - rbLineComment.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - cbPrefixLines.setEnabled(rbBlockComment.isSelected()); - fireChangeEvent(); - } - }); - - cbPrefixLines.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - fireChangeEvent(); - } - }); - - cbSeparatorBefore.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - lblLengthBefore.setEnabled(cbSeparatorBefore.isSelected()); - txtLengthBefore.setEnabled(cbSeparatorBefore.isSelected()); - fireChangeEvent(); - updateBox(); - } - }); - - cbSeparatorAfter.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - lblLengthAfter.setEnabled(cbSeparatorAfter.isSelected()); - txtLengthAfter.setEnabled(cbSeparatorAfter.isSelected()); - fireChangeEvent(); - updateBox(); - } - }); - - final DocumentAdapter documentAdapter = new DocumentAdapter() { - @Override - protected void textChanged(@NotNull DocumentEvent e) { - fireChangeEvent(); - updateBox(); - } - }; - txtLengthBefore.getDocument().addDocumentListener(documentAdapter); - txtLengthAfter.getDocument().addDocumentListener(documentAdapter); - txtFiller.getDocument().addDocumentListener(documentAdapter); - - cbBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent actionEvent) { - fireChangeEvent(); - } - }); - } - - - public LanguageOptions getOptions() { - // If this is a fully custom comment we should really ensure there are no blank lines in the comments outside - // of a block comment. If there are any blank lines the replacement logic will fall apart. - final LanguageOptions res = new LanguageOptions(); - res.setBlock(rbBlockComment.isSelected()); - res.setPrefixLines(!allowBlock || cbPrefixLines.isSelected()); - res.setSeparateAfter(cbSeparatorAfter.isSelected()); - res.setSeparateBefore(cbSeparatorBefore.isSelected()); - try { - res.setLenBefore(Integer.parseInt(txtLengthBefore.getText())); - res.setLenAfter(Integer.parseInt(txtLengthAfter.getText())); - } - catch (NumberFormatException e) { - //leave blank - } - res.setBox(cbBox.isSelected()); - - String filler = txtFiller.getText(); - if (filler.length() > 0) { - res.setFiller(filler); - } - else { - res.setFiller(LanguageOptions.DEFAULT_FILLER); - } - - res.setFileTypeOverride(getOverrideChoice()); - res.setRelativeBefore(rbBefore.isSelected()); - res.setAddBlankAfter(cbAddBlank.isSelected()); - res.setAddBlankBefore(cbAddBlankBefore.isSelected()); - if (fileLocations != null) { - for (int i = 0; i < fileLocations.length; i++) { - if (fileLocations[i].isSelected()) { - res.setFileLocation(i + 1); - } - } - } - - return res; - } - - private int getOverrideChoice() { - return myUseDefaultSettingsRadioButton.isSelected() - ? LanguageOptions.USE_TEMPLATE - : myNoCopyright.isSelected() ? LanguageOptions.NO_COPYRIGHT : LanguageOptions.USE_TEXT; - } - - private void updateOverride() { - int choice = getOverrideChoice(); - LanguageOptions parentOpts = parentPanel != null ? parentPanel.getOptions() : null; - switch (choice) { - case LanguageOptions.NO_COPYRIGHT: - enableFormattingOptions(false); - showPreview(getOptions()); - myRelativeLocationPanel.setEnabled(false); - rbBefore.setEnabled(false); - rbAfter.setEnabled(false); - cbAddBlank.setEnabled(false); - cbAddBlankBefore.setEnabled(false); - if (fileLocations != null) { - for (JRadioButton fileLocation : fileLocations) { - fileLocation.setEnabled(false); - } - } - break; - case LanguageOptions.USE_TEMPLATE: - final boolean isTemplate = parentPanel == null; - enableFormattingOptions(isTemplate); - showPreview(parentOpts != null ? parentOpts : getOptions()); - myRelativeLocationPanel.setEnabled(isTemplate); - rbBefore.setEnabled(isTemplate); - rbAfter.setEnabled(isTemplate); - cbAddBlank.setEnabled(isTemplate); - cbAddBlankBefore.setEnabled(isTemplate); - if (fileLocations != null) { - for (JRadioButton fileLocation : fileLocations) { - fileLocation.setEnabled(true); - } - } - break; - case LanguageOptions.USE_TEXT: - enableFormattingOptions(true); - showPreview(getOptions()); - myRelativeLocationPanel.setEnabled(true); - rbBefore.setEnabled(true); - rbAfter.setEnabled(true); - cbAddBlank.setEnabled(true); - cbAddBlankBefore.setEnabled(true); - if (fileLocations != null) { - for (JRadioButton fileLocation : fileLocations) { - fileLocation.setEnabled(true); - } - } - break; - } - } - - private void enableFormattingOptions(boolean enable) { - if (enable) { - myCommentTypePanel.setEnabled(true); - myBorderPanel.setEnabled(true); - rbBlockComment.setEnabled(true); - rbLineComment.setEnabled(true); - cbPrefixLines.setEnabled(allowBlock); - cbSeparatorBefore.setEnabled(true); - cbSeparatorAfter.setEnabled(true); - lblLengthBefore.setEnabled(cbSeparatorBefore.isSelected()); - txtLengthBefore.setEnabled(cbSeparatorBefore.isSelected()); - lblLengthAfter.setEnabled(cbSeparatorAfter.isSelected()); - txtLengthAfter.setEnabled(cbSeparatorAfter.isSelected()); - mySeparatorCharLabel.setEnabled(true); - updateBox(); - } else { - UIUtil.setEnabled(myCommentTypePanel, false, true); - UIUtil.setEnabled(myBorderPanel, false, true); - } - } - - private void showPreview(LanguageOptions options) { - final String defaultCopyrightText = myNoCopyright.isSelected() ? "" : FileTypeUtil - .buildComment(fileType, VelocityHelper.evaluate(null, null, null, EntityUtil.decode(CopyrightProfileKt.DEFAULT_COPYRIGHT_NOTICE)), options); - SwingUtilities.invokeLater(() -> preview.setText(defaultCopyrightText)); - } - - - public FileType getFileType() { - return fileType; - } - - @Override - @Nls - public String getDisplayName() { - return fileType instanceof LanguageFileType - ? ((LanguageFileType)fileType).getLanguage().getDisplayName() - : fileType.getDisplayName(); - } - - @Override - @NotNull - public String getHelpTopic() { - return "copyright.filetypes"; - } - - @Override - public JComponent createComponent() { - return mainPanel; - } - - @Override - public boolean isModified() { - if (parentPanel == null) return !getCopyrightOptions().getTemplateOptions().equals(getOptions()); - return !getCopyrightOptions().getOptions(fileType.getName()).equals(getOptions()); - } - - @NotNull - private Options getCopyrightOptions() { - return CopyrightManager.getInstance(myProject).getOptions(); - } - - @Override - public void apply() throws ConfigurationException { - final Options options = getCopyrightOptions(); - if (parentPanel == null) { - options.setTemplateOptions(getOptions()); - } - else { - options.setOptions(fileType.getName(), getOptions()); - } - } - - @Override - public void reset() { - final LanguageOptions options = - parentPanel == null ? getCopyrightOptions().getTemplateOptions() : getCopyrightOptions().getOptions(fileType.getName()); - boolean isBlock = options.isBlock(); - if (isBlock) { - rbBlockComment.setSelected(true); - } - else { - rbLineComment.setSelected(true); - } - - cbPrefixLines.setSelected(!allowBlock || options.isPrefixLines()); - cbSeparatorAfter.setSelected(options.isSeparateAfter()); - cbSeparatorBefore.setSelected(options.isSeparateBefore()); - txtLengthBefore.setText(String.valueOf(options.getLenBefore())); - txtLengthAfter.setText(String.valueOf(options.getLenAfter())); - txtFiller.setText(options.getFiller() == LanguageOptions.DEFAULT_FILLER ? "" : options.getFiller()); - cbBox.setSelected(options.isBox()); - - final int fileTypeOverride = options.getFileTypeOverride(); - myUseDefaultSettingsRadioButton.setSelected(fileTypeOverride == LanguageOptions.USE_TEMPLATE); - myUseCustomFormattingOptionsRadioButton.setSelected(fileTypeOverride == LanguageOptions.USE_TEXT); - myNoCopyright.setSelected(fileTypeOverride == LanguageOptions.NO_COPYRIGHT); - if (options.isRelativeBefore()) { - rbBefore.setSelected(true); - } - else { - rbAfter.setSelected(true); - } - cbAddBlank.setSelected(options.isAddBlankAfter()); - cbAddBlankBefore.setSelected(options.isAddBlankBefore()); - - if (fileLocations != null) { - int choice = options.getFileLocation() - 1; - choice = Math.max(0, Math.min(choice, fileLocations.length - 1)); - fileLocations[choice].setSelected(true); - } - - updateOverride(); - } - - public void addOptionChangeListener(TemplateOptionsPanelListener listener) { - listeners.add(TemplateOptionsPanelListener.class, listener); - } - - private void fireChangeEvent() { - Object[] fires = listeners.getListenerList(); - for (int i = fires.length - 2; i >= 0; i -= 2) { - if (fires[i] == TemplateOptionsPanelListener.class) { - ((TemplateOptionsPanelListener)fires[i + 1]).optionChanged(); - } - } - } - - @Override - @NotNull - public String getId() { - return fileType != null ? getHelpTopic() + "." + fileType.getName() : getHelpTopic(); - } - - @NotNull - @Override - public Class getOriginalClass() { - final UpdateCopyrightsProvider provider = fileType != null ? CopyrightUpdaters.INSTANCE.forFileType(fileType) : null; - return provider != null ? provider.getClass() : super.getClass(); - } -} diff --git a/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.kt b/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.kt new file mode 100644 index 000000000000..29c1e021ed16 --- /dev/null +++ b/plugins/copyright/src/com/maddyhome/idea/copyright/ui/TemplateCommentPanel.kt @@ -0,0 +1,472 @@ +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.maddyhome.idea.copyright.ui + +import com.intellij.copyright.CopyrightBundle +import com.intellij.copyright.CopyrightManager.Companion.getInstance +import com.intellij.openapi.editor.colors.EditorFontType +import com.intellij.openapi.fileTypes.FileType +import com.intellij.openapi.fileTypes.LanguageFileType +import com.intellij.openapi.fileTypes.StdFileTypes +import com.intellij.openapi.options.SearchableConfigurable +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.NlsContexts +import com.intellij.ui.DocumentAdapter +import com.intellij.ui.components.JBCheckBox +import com.intellij.ui.components.JBRadioButton +import com.intellij.ui.components.JBTextField +import com.intellij.ui.dsl.builder.RightGap +import com.intellij.ui.dsl.builder.Row +import com.intellij.ui.dsl.builder.RowLayout +import com.intellij.ui.dsl.builder.columns +import com.intellij.ui.dsl.builder.panel +import com.intellij.ui.dsl.gridLayout.HorizontalAlign +import com.intellij.ui.dsl.gridLayout.VerticalAlign +import com.intellij.ui.layout.* +import com.maddyhome.idea.copyright.CopyrightUpdaters +import com.maddyhome.idea.copyright.DEFAULT_COPYRIGHT_NOTICE +import com.maddyhome.idea.copyright.options.LanguageOptions +import com.maddyhome.idea.copyright.options.Options +import com.maddyhome.idea.copyright.pattern.EntityUtil +import com.maddyhome.idea.copyright.pattern.VelocityHelper +import com.maddyhome.idea.copyright.util.FileTypeUtil +import java.awt.event.ActionListener +import javax.swing.JComponent +import javax.swing.JRadioButton +import javax.swing.JTextArea +import javax.swing.SwingUtilities +import javax.swing.event.DocumentEvent +import javax.swing.event.EventListenerList +import kotlin.math.max +import kotlin.math.min + +class TemplateCommentPanel(_fileType: FileType?, + private val parentPanel: TemplateCommentPanel?, + private val project: Project, + vararg locations: @NlsContexts.RadioButton String) : SearchableConfigurable { + + val fileType: FileType + private val allowBlock: Boolean + private val listeners = EventListenerList() + private val fileLocations = mutableListOf() + + private lateinit var noCopyright: JBRadioButton + private lateinit var useDefaultSettingsRadioButton: JBRadioButton + private lateinit var useCustomFormattingOptionsRadioButton: JBRadioButton + + private lateinit var commentTypeGroup: Row + private lateinit var blockComment: JBRadioButton + private lateinit var prefixLines: JBCheckBox + private lateinit var lineComment: JBRadioButton + + private lateinit var relativeLocationGroup: Row + private lateinit var before: JBRadioButton + private lateinit var after: JBRadioButton + + private lateinit var borderGroup: Row + private lateinit var separatorBefore: JBCheckBox + private lateinit var lengthBefore: JBTextField + private lateinit var separatorAfter: JBCheckBox + private lateinit var lengthAfter: JBTextField + private lateinit var filler: JBTextField + + private lateinit var box: JBCheckBox + private lateinit var addBlankBefore: JBCheckBox + private lateinit var addBlank: JBCheckBox + + private lateinit var preview: JTextArea + + val panel = panel { + val updateOverrideListener = ActionListener { updateOverride() } + val changeEventListener = ActionListener { fireChangeEvent() } + val updateBoxListener = ActionListener { + fireChangeEvent() + updateBox() + } + val documentAdapter = object : DocumentAdapter() { + override fun textChanged(e: DocumentEvent) { + fireChangeEvent() + updateBox() + } + } + + + buttonsGroup { + row { + noCopyright = radioButton(CopyrightBundle.message("settings.copyright.formatting.no.copyright")) + .applyToComponent { addActionListener(updateOverrideListener) } + .component + } + row { + useDefaultSettingsRadioButton = radioButton(CopyrightBundle.message("settings.copyright.formatting.use.default.settings")) + .applyToComponent { addActionListener(updateOverrideListener) } + .component + } + row { + useCustomFormattingOptionsRadioButton = radioButton( + CopyrightBundle.message("settings.copyright.formatting.use.custom.formatting.options")) + .applyToComponent { addActionListener(updateOverrideListener) } + .component + } + } + + row { + panel { + commentTypeGroup = group(CopyrightBundle.message("settings.copyright.formatting.comment.type")) { + buttonsGroup { + row { + blockComment = radioButton(CopyrightBundle.message("settings.copyright.formatting.use.block.comment")) + .applyToComponent { addActionListener(changeEventListener) } + .component + } + indent { + row { + prefixLines = checkBox(CopyrightBundle.message("settings.copyright.formatting.prefix.each.line")) + .applyToComponent { addActionListener(changeEventListener) } + .enabledIf(blockComment.selected) + .component + } + } + row { + lineComment = radioButton(CopyrightBundle.message("settings.copyright.formatting.use.line.comment")) + .applyToComponent { addActionListener(changeEventListener) } + .component + } + } + } + relativeLocationGroup = group(CopyrightBundle.message("settings.copyright.formatting.relative.location")) { + buttonsGroup { + row { + before = radioButton(CopyrightBundle.message("settings.copyright.formatting.before.other.comments")) + .component + } + row { + after = radioButton(CopyrightBundle.message("settings.copyright.formatting.after.other.comments")) + .component + } + } + } + }.resizableColumn() + .verticalAlign(VerticalAlign.TOP) + .gap(RightGap.COLUMNS) + + panel { + borderGroup = group(CopyrightBundle.message("settings.copyright.formatting.borders")) { + row { + separatorBefore = checkBox(CopyrightBundle.message("settings.copyright.formatting.separator.before")) + .applyToComponent { addActionListener(updateBoxListener) } + .component + lengthBefore = intTextField() + .label(CopyrightBundle.message("settings.copyright.formatting.length")) + .applyToComponent { document.addDocumentListener(documentAdapter) } + .enabledIf(separatorBefore.selected) + .component + }.layout(RowLayout.PARENT_GRID) + row { + separatorAfter = checkBox(CopyrightBundle.message("settings.copyright.formatting.separator.after")) + .applyToComponent { addActionListener(updateBoxListener) } + .component + lengthAfter = intTextField() + .label(CopyrightBundle.message("settings.copyright.formatting.length")) + .applyToComponent { document.addDocumentListener(documentAdapter) } + .enabledIf(separatorAfter.selected) + .component + }.layout(RowLayout.PARENT_GRID) + row { + filler = textField() + .label(CopyrightBundle.message("settings.copyright.formatting.separator")) + .applyToComponent { document.addDocumentListener(documentAdapter) } + .columns(4) + .component + } + row { + box = checkBox(CopyrightBundle.message("settings.copyright.formatting.box")) + .applyToComponent { addActionListener(changeEventListener) } + .component + } + row { + addBlankBefore = checkBox(CopyrightBundle.message("settings.copyright.formatting.add.blank.line.before")) + .component + } + row { + addBlank = checkBox(CopyrightBundle.message("settings.copyright.formatting.add.blank.line.after")) + .component + } + } + }.resizableColumn() + .verticalAlign(VerticalAlign.TOP) + } + + if (locations.isNotEmpty()) { + group(CopyrightBundle.message("settings.copyright.formatting.location.in.file")) { + buttonsGroup { + for (location in locations) { + row { + fileLocations += radioButton(location).component + } + } + } + } + } + + row { + preview = textArea() + .horizontalAlign(HorizontalAlign.FILL) + .verticalAlign(VerticalAlign.FILL) + .applyToComponent { + isEditable = false + font = EditorFontType.getGlobalPlainFont() + } + .component + }.resizableRow() + } + + init { + if (_fileType == null) { + useDefaultSettingsRadioButton.isVisible = false + useCustomFormattingOptionsRadioButton.isVisible = false + noCopyright.isVisible = false + } + + fileType = _fileType ?: StdFileTypes.JAVA + allowBlock = FileTypeUtil.hasBlockComment(fileType) + + parentPanel?.addOptionChangeListener(TemplateOptionsPanelListener { updateOverride() }) + + addOptionChangeListener { showPreview(getOptions()) } + } + + override fun getDisplayName(): String { + return if (fileType is LanguageFileType) fileType.language.displayName else fileType.displayName + } + + override fun getHelpTopic(): String { + return "copyright.filetypes" + } + + override fun getOriginalClass(): Class<*> { + val provider = CopyrightUpdaters.INSTANCE.forFileType(fileType) + return provider?.javaClass ?: super.getOriginalClass() + } + + override fun getId(): String { + return helpTopic + "." + fileType.name + } + + override fun createComponent(): JComponent { + return panel + } + + override fun isModified(): Boolean { + if (parentPanel == null) { + return getCopyrightOptions().templateOptions != getOptions() + } + + return getCopyrightOptions().getOptions(fileType.name) != getOptions() + } + + override fun apply() { + val options = getCopyrightOptions() + if (parentPanel == null) { + options.templateOptions = getOptions() + } + else { + options.setOptions(fileType.name, getOptions()) + } + } + + override fun reset() { + val options = if (parentPanel == null) getCopyrightOptions().templateOptions + else getCopyrightOptions().getOptions(fileType.name) + val isBlock = options.isBlock + if (isBlock) { + blockComment.isSelected = true + } + else { + lineComment.isSelected = true + } + + prefixLines.isSelected = !allowBlock || options.isPrefixLines + separatorAfter.isSelected = options.isSeparateAfter + separatorBefore.isSelected = options.isSeparateBefore + lengthBefore.text = options.getLenBefore().toString() + lengthAfter.text = options.getLenAfter().toString() + filler.text = if (options.getFiller() === LanguageOptions.DEFAULT_FILLER) "" else options.getFiller() + box.isSelected = options.isBox + + val fileTypeOverride = options.getFileTypeOverride() + useDefaultSettingsRadioButton.isSelected = fileTypeOverride == LanguageOptions.USE_TEMPLATE + useCustomFormattingOptionsRadioButton.isSelected = fileTypeOverride == LanguageOptions.USE_TEXT + noCopyright.isSelected = fileTypeOverride == LanguageOptions.NO_COPYRIGHT + if (options.isRelativeBefore) { + before.isSelected = true + } + else { + after.isSelected = true + } + addBlank.isSelected = options.isAddBlankAfter + addBlankBefore.isSelected = options.isAddBlankBefore + + if (fileLocations.isNotEmpty()) { + var choice = options.getFileLocation() - 1 + choice = max(0, min(choice, fileLocations.size - 1)) + fileLocations[choice].isSelected = true + } + + updateOverride() + } + + private fun getOptions(): LanguageOptions { + // If this is a fully custom comment we should really ensure there are no blank lines in the comments outside + // of a block comment. If there are any blank lines the replacement logic will fall apart. + val result = LanguageOptions() + result.isBlock = blockComment.isSelected + result.isPrefixLines = !allowBlock || prefixLines.isSelected + result.isSeparateAfter = separatorAfter.isSelected + result.isSeparateBefore = separatorBefore.isSelected + try { + result.setLenBefore(lengthBefore.text.toInt()) + result.setLenAfter(lengthAfter.text.toInt()) + } + catch (e: NumberFormatException) { + //leave blank + } + result.isBox = box.isSelected + val filler = filler.text + if (filler.isNotEmpty()) { + result.setFiller(filler) + } + else { + result.setFiller(LanguageOptions.DEFAULT_FILLER) + } + result.setFileTypeOverride(getOverrideChoice()) + result.isRelativeBefore = before.isSelected + result.isAddBlankAfter = addBlank.isSelected + result.isAddBlankBefore = addBlankBefore.isSelected + if (fileLocations.isNotEmpty()) { + for (i in fileLocations.indices) { + if (fileLocations[i].isSelected) { + result.setFileLocation(i + 1) + } + } + } + return result + } + + private fun getOverrideChoice(): Int { + return if (useDefaultSettingsRadioButton.isSelected) LanguageOptions.USE_TEMPLATE + else + if (noCopyright.isSelected) LanguageOptions.NO_COPYRIGHT else LanguageOptions.USE_TEXT + } + + private fun updateOverride() { + val choice = getOverrideChoice() + val parentOpts = parentPanel?.getOptions() + when (choice) { + LanguageOptions.NO_COPYRIGHT -> { + enableFormattingOptions(false) + showPreview(getOptions()) + relativeLocationGroup.enabled(false) + before.isEnabled = false + after.isEnabled = false + addBlank.isEnabled = false + addBlankBefore.isEnabled = false + if (fileLocations.isNotEmpty()) { + for (fileLocation in fileLocations) { + fileLocation.isEnabled = false + } + } + } + LanguageOptions.USE_TEMPLATE -> { + val isTemplate = parentPanel == null + enableFormattingOptions(isTemplate) + showPreview(parentOpts ?: getOptions()) + relativeLocationGroup.enabled(isTemplate) + before.isEnabled = isTemplate + after.isEnabled = isTemplate + addBlank.isEnabled = isTemplate + addBlankBefore.isEnabled = isTemplate + if (fileLocations.isNotEmpty()) { + for (fileLocation in fileLocations) { + fileLocation.isEnabled = true + } + } + } + LanguageOptions.USE_TEXT -> { + enableFormattingOptions(true) + showPreview(getOptions()) + relativeLocationGroup.enabled(true) + before.isEnabled = true + after.isEnabled = true + addBlank.isEnabled = true + addBlankBefore.isEnabled = true + if (fileLocations.isNotEmpty()) { + for (fileLocation in fileLocations) { + fileLocation.isEnabled = true + } + } + } + } + } + + private fun enableFormattingOptions(enable: Boolean) { + if (enable) { + commentTypeGroup.enabled(true) + borderGroup.enabled(true) + blockComment.isEnabled = true + lineComment.isEnabled = true + prefixLines.isEnabled = allowBlock + separatorBefore.isEnabled = true + separatorAfter.isEnabled = true + lengthBefore.isEnabled = separatorBefore.isSelected + lengthBefore.isEnabled = separatorBefore.isSelected + lengthAfter.isEnabled = separatorAfter.isSelected + lengthAfter.isEnabled = separatorAfter.isSelected + updateBox() + } + else { + commentTypeGroup.enabled(false) + borderGroup.enabled(false) + } + } + + private fun updateBox() { + var enable = true + if (!separatorBefore.isSelected || !separatorAfter.isSelected) { + enable = false + } + else { + if (lengthBefore.text != lengthAfter.text) { + enable = false + } + } + val either = separatorBefore.isSelected || separatorAfter.isSelected + box.isEnabled = enable + filler.isEnabled = either + } + + private fun showPreview(options: LanguageOptions) { + val defaultCopyrightText = if (noCopyright.isSelected) "" + else FileTypeUtil + .buildComment(fileType, VelocityHelper.evaluate(null, null, null, EntityUtil.decode(DEFAULT_COPYRIGHT_NOTICE)), options) + SwingUtilities.invokeLater { preview.text = defaultCopyrightText } + } + + private fun addOptionChangeListener(listener: TemplateOptionsPanelListener) { + listeners.add(TemplateOptionsPanelListener::class.java, listener) + } + + private fun fireChangeEvent() { + val fires = listeners.listenerList + var i = fires.size - 2 + while (i >= 0) { + if (fires[i] === TemplateOptionsPanelListener::class.java) { + (fires[i + 1] as TemplateOptionsPanelListener).optionChanged() + } + i -= 2 + } + } + + private fun getCopyrightOptions(): Options { + return getInstance(project).options + } +} \ No newline at end of file