From a5abd5e510a6663f48ad9efcc0e6d6aa90f1210a Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Tue, 9 Oct 2018 15:49:17 +0300 Subject: [PATCH] IDEA-155327 Improvement to automated Branch Name in the Open Task dialog adding placeholders --- .../intellij/ui/ExpandableEditorSupport.java | 12 +++++-- .../tasks/CommitPlaceholderProvider.java | 2 +- .../tasks/config/TaskConfigurable.java | 35 +++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/ExpandableEditorSupport.java b/platform/platform-impl/src/com/intellij/ui/ExpandableEditorSupport.java index c88d747074a0..f098e0c953e0 100644 --- a/platform/platform-impl/src/com/intellij/ui/ExpandableEditorSupport.java +++ b/platform/platform-impl/src/com/intellij/ui/ExpandableEditorSupport.java @@ -7,6 +7,7 @@ import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.ex.FoldingModelEx; import com.intellij.ui.components.JBScrollBar; import com.intellij.ui.components.fields.ExpandableSupport; +import com.intellij.ui.components.fields.ExtendableTextComponent; import com.intellij.util.Function; import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.NotNull; @@ -36,9 +37,16 @@ public class ExpandableEditorSupport extends ExpandableSupport } protected void initFieldEditor(@NotNull EditorEx editor, Color background) { - JLabel label = ExpandableSupport.createLabel(createExpandExtension()); - label.setBorder(JBUI.Borders.empty(2, 2, 2, 0)); editor.getContentComponent().putClientProperty(Expandable.class, this); + ExtendableTextComponent.Extension extension = createExpandExtension(); + setupExtension(editor, background, extension); + } + + public static void setupExtension(@NotNull EditorEx editor, + Color background, + ExtendableTextComponent.Extension extension) { + JLabel label = ExpandableSupport.createLabel(extension); + label.setBorder(JBUI.Borders.empty(2, 2, 2, 0)); editor.getScrollPane().setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); editor.getScrollPane().setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); editor.getScrollPane().getVerticalScrollBar().setBackground(background); diff --git a/platform/tasks-platform-api/src/com/intellij/tasks/CommitPlaceholderProvider.java b/platform/tasks-platform-api/src/com/intellij/tasks/CommitPlaceholderProvider.java index 24af3f740b18..468d9ac8d5f0 100644 --- a/platform/tasks-platform-api/src/com/intellij/tasks/CommitPlaceholderProvider.java +++ b/platform/tasks-platform-api/src/com/intellij/tasks/CommitPlaceholderProvider.java @@ -27,7 +27,7 @@ public interface CommitPlaceholderProvider { ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.tasks.commitPlaceholderProvider"); @NotNull - String[] getPlaceholders(TaskRepository repository); + String[] getPlaceholders(@Nullable TaskRepository repository); @Nullable String getPlaceholderValue(LocalTask task, String placeholder); diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/config/TaskConfigurable.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/config/TaskConfigurable.java index 8541ee788052..8e9a8c9f50fb 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/config/TaskConfigurable.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/config/TaskConfigurable.java @@ -15,6 +15,8 @@ */ package com.intellij.tasks.config; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.PlainTextFileType; @@ -26,20 +28,30 @@ import com.intellij.openapi.options.binding.BindableConfigurable; import com.intellij.openapi.options.binding.ControlBinder; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.PopupStep; +import com.intellij.openapi.ui.popup.util.BaseListPopupStep; import com.intellij.openapi.util.NotNullLazyValue; +import com.intellij.tasks.CommitPlaceholderProvider; import com.intellij.tasks.TaskManager; import com.intellij.tasks.TaskRepository; import com.intellij.tasks.impl.BaseRepositoryImpl; import com.intellij.tasks.impl.TaskManagerImpl; import com.intellij.ui.EditorTextField; +import com.intellij.ui.ExpandableEditorSupport; import com.intellij.ui.GuiUtils; import com.intellij.ui.components.JBCheckBox; +import com.intellij.ui.components.fields.ExtendableTextComponent; +import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; /** * @author Dmitry Avdeev @@ -195,6 +207,29 @@ public class TaskConfigurable extends BindableConfigurable implements Searchable } Project project = ProjectManager.getInstance().getDefaultProject(); myBranchNameFormat = new EditorTextField(project, fileType); + setupAddAction(myBranchNameFormat); myChangelistNameFormat = new EditorTextField(project, fileType); + setupAddAction(myChangelistNameFormat); + } + + private void setupAddAction(EditorTextField field) { + field.addSettingsProvider(editor -> { + ExtendableTextComponent.Extension extension = + ExtendableTextComponent.Extension.create(AllIcons.General.Add, "Add placeholder", () -> { + Set placeholders = new HashSet<>(); + for (CommitPlaceholderProvider provider : CommitPlaceholderProvider.EXTENSION_POINT_NAME.getExtensionList()) { + placeholders.addAll(Arrays.asList(provider.getPlaceholders(null))); + } + JBPopupFactory.getInstance().createListPopup(new BaseListPopupStep("Placeholders", ArrayUtil.toStringArray(placeholders)) { + @Override + public PopupStep onChosen(String selectedValue, boolean finalChoice) { + WriteCommandAction.runWriteCommandAction(myProject, () -> editor.getDocument() + .insertString(editor.getCaretModel().getOffset(), "${" + selectedValue + "}")); + return FINAL_CHOICE; + } + }).showInBestPositionFor(editor); + }); + ExpandableEditorSupport.setupExtension(editor, field.getBackground(), extension); + }); } }