diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/llama/form/LlamaServerPreferencesForm.java b/src/main/java/ee/carlrobert/codegpt/settings/service/llama/form/LlamaServerPreferencesForm.java index 581e4bc6..de94c25c 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/llama/form/LlamaServerPreferencesForm.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/llama/form/LlamaServerPreferencesForm.java @@ -32,6 +32,7 @@ import ee.carlrobert.codegpt.settings.service.llama.LlamaSettingsState; import ee.carlrobert.codegpt.ui.OverlayUtil; import ee.carlrobert.codegpt.ui.UIUtil; import ee.carlrobert.codegpt.ui.UIUtil.RadioButtonWithLayout; +import ee.carlrobert.codegpt.ui.URLTextField; import java.util.List; import java.util.Map; import javax.swing.JButton; @@ -82,7 +83,7 @@ public class LlamaServerPreferencesForm { additionalBuildParametersField = new JBTextField(settings.getAdditionalBuildParameters(), 30); additionalBuildParametersField.setEnabled(!serverRunning); - baseHostField = new JBTextField(settings.getBaseHost(), 30); + baseHostField = new URLTextField(settings.getBaseHost(), 30); apiKeyField = new JBPasswordField(); apiKeyField.setColumns(30); ApplicationManager.getApplication().executeOnPooledThread(() -> { diff --git a/src/main/kotlin/ee/carlrobert/codegpt/settings/service/custom/form/CustomServiceChatCompletionForm.kt b/src/main/kotlin/ee/carlrobert/codegpt/settings/service/custom/form/CustomServiceChatCompletionForm.kt index 24b97408..936eedc9 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/settings/service/custom/form/CustomServiceChatCompletionForm.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/settings/service/custom/form/CustomServiceChatCompletionForm.kt @@ -1,7 +1,6 @@ package ee.carlrobert.codegpt.settings.service.custom.form import com.intellij.openapi.ui.MessageType -import com.intellij.ui.components.JBTextField import com.intellij.util.ui.FormBuilder import ee.carlrobert.codegpt.CodeGPTBundle import ee.carlrobert.codegpt.completions.CompletionRequestProvider @@ -9,6 +8,7 @@ import ee.carlrobert.codegpt.completions.CompletionRequestService import ee.carlrobert.codegpt.settings.service.custom.CustomServiceChatCompletionSettingsState import ee.carlrobert.codegpt.settings.service.custom.CustomServiceFormTabbedPane import ee.carlrobert.codegpt.ui.OverlayUtil +import ee.carlrobert.codegpt.ui.URLTextField import ee.carlrobert.llm.client.openai.completion.ErrorDetails import ee.carlrobert.llm.completion.CompletionEventListener import okhttp3.sse.EventSource @@ -22,7 +22,7 @@ class CustomServiceChatCompletionForm( val getApiKey: () -> String? ) { - private val urlField = JBTextField(state.url, 30) + private val urlField = URLTextField(state.url, 30) private val tabbedPane = CustomServiceFormTabbedPane(state.headers, state.body) private val testConnectionButton = JButton( CodeGPTBundle.get("settingsConfigurable.service.custom.openai.testConnection.label") diff --git a/src/main/kotlin/ee/carlrobert/codegpt/settings/service/custom/form/CustomServiceCodeCompletionForm.kt b/src/main/kotlin/ee/carlrobert/codegpt/settings/service/custom/form/CustomServiceCodeCompletionForm.kt index ce805a04..541f905a 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/settings/service/custom/form/CustomServiceCodeCompletionForm.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/settings/service/custom/form/CustomServiceCodeCompletionForm.kt @@ -8,7 +8,6 @@ import com.intellij.openapi.ui.panel.ComponentPanelBuilder import com.intellij.ui.EnumComboBoxModel import com.intellij.ui.components.JBCheckBox import com.intellij.ui.components.JBLabel -import com.intellij.ui.components.JBTextField import com.intellij.util.ui.FormBuilder import ee.carlrobert.codegpt.CodeGPTBundle import ee.carlrobert.codegpt.codecompletions.CodeCompletionRequestFactory @@ -19,6 +18,7 @@ import ee.carlrobert.codegpt.settings.configuration.Placeholder import ee.carlrobert.codegpt.settings.service.custom.CustomServiceCodeCompletionSettingsState import ee.carlrobert.codegpt.settings.service.custom.CustomServiceFormTabbedPane import ee.carlrobert.codegpt.ui.OverlayUtil +import ee.carlrobert.codegpt.ui.URLTextField import ee.carlrobert.llm.client.openai.completion.ErrorDetails import ee.carlrobert.llm.completion.CompletionEventListener import okhttp3.sse.EventSource @@ -48,7 +48,7 @@ class CustomServiceCodeCompletionForm( } } private val promptTemplateHelpText = JBLabel(General.ContextHelp) - private val urlField = JBTextField(state.url, 30) + private val urlField = URLTextField(state.url, 30) private val tabbedPane = CustomServiceFormTabbedPane(state.headers, state.body) private val testConnectionButton = JButton( CodeGPTBundle.get("settingsConfigurable.service.custom.openai.testConnection.label") diff --git a/src/main/kotlin/ee/carlrobert/codegpt/settings/service/ollama/OllamaSettingsForm.kt b/src/main/kotlin/ee/carlrobert/codegpt/settings/service/ollama/OllamaSettingsForm.kt index 208d85b9..8206362f 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/settings/service/ollama/OllamaSettingsForm.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/settings/service/ollama/OllamaSettingsForm.kt @@ -13,6 +13,7 @@ import ee.carlrobert.codegpt.CodeGPTBundle import ee.carlrobert.codegpt.settings.service.CodeCompletionConfigurationForm import ee.carlrobert.codegpt.ui.OverlayUtil import ee.carlrobert.codegpt.ui.UIUtil +import ee.carlrobert.codegpt.ui.URLTextField import ee.carlrobert.llm.client.ollama.OllamaClient import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking @@ -46,7 +47,7 @@ class OllamaSettingsForm { modelComboBox = ComboBox(emptyModelsComboBoxModel).apply { isEnabled = false } - hostField = JBTextField().apply { + hostField = URLTextField().apply { text = settings.host whenTextChangedFromUi { modelComboBox.model = emptyModelsComboBoxModel diff --git a/src/main/kotlin/ee/carlrobert/codegpt/ui/URLTextField.kt b/src/main/kotlin/ee/carlrobert/codegpt/ui/URLTextField.kt new file mode 100644 index 00000000..c816897a --- /dev/null +++ b/src/main/kotlin/ee/carlrobert/codegpt/ui/URLTextField.kt @@ -0,0 +1,27 @@ +package ee.carlrobert.codegpt.ui + +import com.intellij.ui.components.JBTextField +import org.jetbrains.annotations.Nls +import java.awt.event.FocusAdapter +import java.awt.event.FocusEvent + +/** + * [JBTextField] that automatically removes all trailing "/" after loosing focus. + */ +class URLTextField : JBTextField { + constructor() : super() + constructor(columns: Int) : super(columns) + constructor(text: @Nls String?) : super(text) + constructor(text: @Nls String?, columns: Int) : super(text, columns) + + init { + addFocusListener(object : FocusAdapter() { + override fun focusLost(e: FocusEvent) { + val text: String = getText() + if (text.endsWith("/")) { + setText(text.trimEnd('/')) + } + } + }) + } +}