diff --git a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/ANSIColoredConsoleColorsPage.java b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/ANSIColoredConsoleColorsPage.java index faaa74937472..90e554fe37f5 100644 --- a/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/ANSIColoredConsoleColorsPage.java +++ b/platform/lang-impl/src/com/intellij/openapi/options/colors/pages/ANSIColoredConsoleColorsPage.java @@ -21,6 +21,8 @@ import com.intellij.terminal.JBTerminalSystemSettingsProviderBase; import com.intellij.ui.EditorCustomization; import com.intellij.ui.ExperimentalUI; import com.intellij.util.ArrayUtil; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -237,9 +239,30 @@ public final class ANSIColoredConsoleColorsPage implements ColorSettingsPage, Di @Override public @NotNull String getDisplayName() { + return getSearchableName(); + } + + @ApiStatus.Internal + public static @Nls @NotNull String getSearchableName() { return OptionsBundle.message("color.settings.console.name"); } + @ApiStatus.Internal + public static @Nls @NotNull String getSearchableReworkedTerminalName() { + // We need something to provide to com.intellij.application.options.colors.ColorAndFontOptions.selectOrEditColor as a name. + // However, due to the incredibly complicated interaction between + // com.intellij.application.options.colors.OptionsPanelImpl.processListValueChanged, + // Swing events and their listeners, it turns out that if we try to select "Reworked terminal" (the parent node), + // then the selection is reset immediately as the configurable is shown. + // The reason for this is that some previously saved selection is loaded. + // The only way to avoid this without changing anything in that complicated logic + // is to pass something that can overwrite the previously saved selection. + // However, according to processListValueChanged, only nodes that implement EditorSchemeAttributeDescriptor are saved. + // The "Reworked terminal" parent doesn't implement it (it's just a String), but individual colors do. + // So we select the first color. + return OptionsBundle.message("color.settings.terminal.black"); + } + @Override public @NotNull Icon getIcon() { return PlainTextFileType.INSTANCE.getIcon(); diff --git a/plugins/terminal/resources/messages/TerminalBundle.properties b/plugins/terminal/resources/messages/TerminalBundle.properties index 2fe4b84eea3d..f9db1d192502 100644 --- a/plugins/terminal/resources/messages/TerminalBundle.properties +++ b/plugins/terminal/resources/messages/TerminalBundle.properties @@ -91,6 +91,8 @@ settings.font.name=&Font: settings.font.size=Size: settings.line.height=Line height: settings.column.width=Column width: +settings.colors=Configure colors\u2026 + settings.audible.bell=Audible bell settings.close.session.when.it.ends=Close session when it ends settings.mouse.reporting=Mouse reporting diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsConfigurable.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsConfigurable.kt index 87c43254eea7..5d9c307467e6 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsConfigurable.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalOptionsConfigurable.kt @@ -1,8 +1,10 @@ // Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.plugins.terminal +import com.intellij.application.options.colors.ColorAndFontOptions import com.intellij.codeWithMe.ClientId import com.intellij.execution.configuration.EnvironmentVariablesTextFieldWithBrowseButton +import com.intellij.ide.DataManager import com.intellij.ide.IdeBundle import com.intellij.openapi.application.ApplicationBundle import com.intellij.openapi.client.ClientKind @@ -13,6 +15,7 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory import com.intellij.openapi.options.BoundSearchableConfigurable import com.intellij.openapi.options.UnnamedConfigurable import com.intellij.openapi.options.advanced.AdvancedSettings +import com.intellij.openapi.options.colors.pages.ANSIColoredConsoleColorsPage import com.intellij.openapi.project.Project import com.intellij.openapi.ui.ComboBox import com.intellij.openapi.ui.DialogPanel @@ -22,6 +25,7 @@ import com.intellij.ui.DocumentAdapter import com.intellij.ui.ExperimentalUI import com.intellij.ui.FontComboBox import com.intellij.ui.FontInfoRenderer +import com.intellij.ui.components.ActionLink import com.intellij.ui.components.JBTextField import com.intellij.ui.components.textFieldWithHistoryWithBrowseButton import com.intellij.ui.dsl.builder.* @@ -37,6 +41,7 @@ import org.jetbrains.plugins.terminal.block.feedback.askForFeedbackIfReworkedTer import org.jetbrains.plugins.terminal.block.prompt.TerminalPromptStyle import org.jetbrains.plugins.terminal.runner.LocalTerminalStartCommandBuilder import java.awt.Color +import java.awt.Component import javax.swing.JComponent import javax.swing.JTextField import javax.swing.UIManager @@ -169,6 +174,16 @@ internal class TerminalOptionsConfigurable(private val project: Project) : Bound ) } + row { + cell(ActionLink(message("settings.colors")) { actionEvent -> + ColorAndFontOptions.selectOrEditColor( + DataManager.getInstance().getDataContext(actionEvent.source as? Component?), + ANSIColoredConsoleColorsPage.getSearchableReworkedTerminalName(), + ANSIColoredConsoleColorsPage.getSearchableName(), + ) + }) + }.visibleIf(terminalEngineComboBox.selectedValueIs(TerminalEngine.REWORKED)) + onApply { TerminalFontSettingsService.getInstance().setSettings(fontSettings) }