diff --git a/src/main/java/ee/carlrobert/codegpt/CodeGPTUpdateStartupActivity.java b/src/main/java/ee/carlrobert/codegpt/CodeGPTUpdateStartupActivity.java index 2ceeadff..f8ee4c6c 100644 --- a/src/main/java/ee/carlrobert/codegpt/CodeGPTUpdateStartupActivity.java +++ b/src/main/java/ee/carlrobert/codegpt/CodeGPTUpdateStartupActivity.java @@ -13,7 +13,7 @@ import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.updateSettings.impl.UpdateChecker; import com.intellij.openapi.updateSettings.impl.UpdateSettings; import com.intellij.util.concurrency.AppExecutorUtil; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.ui.OverlayUtil; import java.util.concurrent.TimeUnit; import org.jetbrains.annotations.NotNull; @@ -31,7 +31,7 @@ public class CodeGPTUpdateStartupActivity implements StartupActivity.Background private void schedulePluginUpdateChecks(Project project) { AppExecutorUtil.getAppScheduledExecutorService().scheduleWithFixedDelay(() -> { - if (project != null && ConfigurationState.getInstance().isCheckForPluginUpdates()) { + if (project != null && ConfigurationSettings.getCurrentState().isCheckForPluginUpdates()) { new CheckForUpdatesTask(project).queue(); } @@ -67,7 +67,7 @@ public class CodeGPTUpdateStartupActivity implements StartupActivity.Background .executeOnPooledThread(() -> installCodeGPTUpdate(myProject)))) .addAction(NotificationAction.createSimpleExpiring( CodeGPTBundle.get("checkForUpdatesTask.notification.hideButton"), - () -> ConfigurationState.getInstance().setCheckForPluginUpdates(false))) + () -> ConfigurationSettings.getCurrentState().setCheckForPluginUpdates(false))) .notify(myProject); } } diff --git a/src/main/java/ee/carlrobert/codegpt/ProjectCompilationStatusListener.java b/src/main/java/ee/carlrobert/codegpt/ProjectCompilationStatusListener.java index 19331118..857c9d98 100644 --- a/src/main/java/ee/carlrobert/codegpt/ProjectCompilationStatusListener.java +++ b/src/main/java/ee/carlrobert/codegpt/ProjectCompilationStatusListener.java @@ -15,7 +15,7 @@ import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.openapi.project.Project; import ee.carlrobert.codegpt.completions.CompletionRequestProvider; import ee.carlrobert.codegpt.conversations.message.Message; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager; import ee.carlrobert.codegpt.ui.OverlayUtil; import ee.carlrobert.embedding.ReferencedFile; @@ -40,8 +40,7 @@ public class ProjectCompilationStatusListener implements CompilationStatusListen int errors, int warnings, @NotNull CompileContext compileContext) { - var configuration = ConfigurationState.getInstance(); - var success = !configuration.isCaptureCompileErrors() + var success = !ConfigurationSettings.getCurrentState().isCaptureCompileErrors() || (!aborted && errors == 0 && warnings == 0); if (success) { return; @@ -56,7 +55,7 @@ public class ProjectCompilationStatusListener implements CompilationStatusListen .sendMessage(getMultiFileMessage(compileContext), FIX_COMPILE_ERRORS))) .addAction(NotificationAction.createSimpleExpiring( CodeGPTBundle.get("checkForUpdatesTask.notification.hideButton"), - () -> ConfigurationState.getInstance().setCaptureCompileErrors(false))) + () -> ConfigurationSettings.getCurrentState().setCaptureCompileErrors(false))) .notify(project); } } diff --git a/src/main/java/ee/carlrobert/codegpt/actions/DisableCompletionsAction.java b/src/main/java/ee/carlrobert/codegpt/actions/DisableCompletionsAction.java index 13e444d6..89c5c522 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/DisableCompletionsAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/DisableCompletionsAction.java @@ -4,7 +4,7 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; import ee.carlrobert.codegpt.codecompletions.CodeGPTEditorManager; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import org.jetbrains.annotations.NotNull; /** @@ -14,7 +14,7 @@ public class DisableCompletionsAction extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent e) { - ConfigurationState.getInstance().setCodeCompletionsEnabled(false); + ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(false); CodeGPTEditorManager.getInstance().disposeAllInlays(e.getProject()); ApplicationManager.getApplication() .getMessageBus().syncPublisher(CodeCompletionEnabledListener.TOPIC) @@ -23,7 +23,7 @@ public class DisableCompletionsAction extends AnAction { @Override public void update(@NotNull AnActionEvent e) { - var codeCompletionEnabled = ConfigurationState.getInstance().isCodeCompletionsEnabled(); + var codeCompletionEnabled = ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled(); e.getPresentation().setEnabled(codeCompletionEnabled); e.getPresentation().setVisible(codeCompletionEnabled); } diff --git a/src/main/java/ee/carlrobert/codegpt/actions/EnableCompletionsAction.java b/src/main/java/ee/carlrobert/codegpt/actions/EnableCompletionsAction.java index 39fe132b..322598c1 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/EnableCompletionsAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/EnableCompletionsAction.java @@ -3,7 +3,7 @@ package ee.carlrobert.codegpt.actions; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import org.jetbrains.annotations.NotNull; /** @@ -13,7 +13,7 @@ public class EnableCompletionsAction extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent e) { - ConfigurationState.getInstance().setCodeCompletionsEnabled(true); + ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(true); ApplicationManager.getApplication() .getMessageBus().syncPublisher(CodeCompletionEnabledListener.TOPIC) .onCodeCompletionsEnabledChange(true); @@ -21,7 +21,7 @@ public class EnableCompletionsAction extends AnAction { @Override public void update(@NotNull AnActionEvent e) { - var codeCompletionEnabled = ConfigurationState.getInstance().isCodeCompletionsEnabled(); + var codeCompletionEnabled = ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled(); e.getPresentation().setEnabled(!codeCompletionEnabled); e.getPresentation().setVisible(!codeCompletionEnabled); } diff --git a/src/main/java/ee/carlrobert/codegpt/actions/editor/EditorActionsUtil.java b/src/main/java/ee/carlrobert/codegpt/actions/editor/EditorActionsUtil.java index 53f0eead..edce3167 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/editor/EditorActionsUtil.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/editor/EditorActionsUtil.java @@ -12,7 +12,7 @@ import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.project.Project; import ee.carlrobert.codegpt.CodeGPTKeys; import ee.carlrobert.codegpt.conversations.message.Message; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager; import ee.carlrobert.codegpt.util.file.FileUtil; import ee.carlrobert.embedding.ReferencedFile; @@ -52,7 +52,7 @@ public class EditorActionsUtil { group.add(new CustomPromptAction()); group.addSeparator(); - var configuredActions = ConfigurationState.getInstance().getTableData(); + var configuredActions = ConfigurationSettings.getCurrentState().getTableData(); configuredActions.forEach((label, prompt) -> { // using label as action description to prevent com.intellij.diagnostic.PluginException // https://github.com/carlrobertoh/CodeGPT/issues/95 diff --git a/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionEventListener.java b/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionEventListener.java index f6576e88..0886e1b5 100644 --- a/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionEventListener.java +++ b/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionEventListener.java @@ -17,7 +17,7 @@ import javax.annotation.ParametersAreNonnullByDefault; import org.jetbrains.annotations.Nullable; @ParametersAreNonnullByDefault -class CodeCompletionEventListener implements CompletionEventListener { +class CodeCompletionEventListener implements CompletionEventListener { private static final Logger LOG = Logger.getInstance(CodeCompletionEventListener.class); diff --git a/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionListenerBinder.java b/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionListenerBinder.java index 6d4a8c48..e40b2f9c 100644 --- a/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionListenerBinder.java +++ b/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionListenerBinder.java @@ -10,7 +10,7 @@ import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.SelectionEvent; import com.intellij.openapi.editor.event.SelectionListener; import ee.carlrobert.codegpt.actions.CodeCompletionEnabledListener; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,7 +25,7 @@ public class CodeCompletionListenerBinder implements Disposable { public CodeCompletionListenerBinder(Editor editor) { this.editor = editor; - if (ConfigurationState.getInstance().isCodeCompletionsEnabled()) { + if (ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled()) { addListeners(); } diff --git a/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionService.java b/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionService.java index 096a8e45..8b8ee100 100644 --- a/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionService.java +++ b/src/main/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionService.java @@ -22,10 +22,8 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorCustomElementRenderer; import com.intellij.openapi.editor.Inlay; import com.intellij.openapi.editor.InlayModel; -import com.intellij.openapi.editor.impl.EditorImpl; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectUtil; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; @@ -35,7 +33,7 @@ import com.intellij.util.concurrency.annotations.RequiresReadLock; import com.intellij.util.concurrency.annotations.RequiresWriteLock; import ee.carlrobert.codegpt.actions.CodeCompletionEnabledListener; import ee.carlrobert.codegpt.completions.CompletionRequestService; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.util.EditorUtil; import java.awt.event.KeyEvent; import java.util.List; @@ -77,7 +75,7 @@ public final class CodeCompletionService implements Disposable { Project project = editor.getProject(); if (project == null || project.isDisposed() - || !ConfigurationState.getInstance().isCodeCompletionsEnabled() + || !ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled() || !EditorUtil.isSelectedEditor(editor) || LookupManager.getActiveLookup(editor) != null || editor.isViewer() @@ -155,7 +153,7 @@ public final class CodeCompletionService implements Disposable { Document document = editor.getDocument(); document.insertString(offset, text); editor.getCaretModel().moveToOffset(offset + text.length()); - if (ConfigurationState.getInstance().isAutoFormattingEnabled()) { + if (ConfigurationSettings.getCurrentState().isAutoFormattingEnabled()) { EditorUtil.reformatDocument( requireNonNull(editor.getProject()), document, diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java index fe52ff7b..2913274e 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java @@ -14,7 +14,7 @@ import ee.carlrobert.codegpt.completions.llama.PromptTemplate; import ee.carlrobert.codegpt.conversations.Conversation; import ee.carlrobert.codegpt.conversations.ConversationsState; import ee.carlrobert.codegpt.conversations.message.Message; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.settings.service.ServiceType; import ee.carlrobert.codegpt.settings.state.IncludedFilesSettingsState; import ee.carlrobert.codegpt.settings.state.LlamaSettingsState; @@ -123,7 +123,7 @@ public class CompletionRequestProvider { systemPrompt, message.getPrompt(), conversation.getMessages()); - var configuration = ConfigurationState.getInstance(); + var configuration = ConfigurationSettings.getCurrentState(); return new LlamaCompletionRequest.Builder(prompt) .setN_predict(configuration.getMaxTokens()) .setTemperature(configuration.getTemperature()) @@ -154,13 +154,13 @@ public class CompletionRequestProvider { CallParameters callParameters, boolean useContextualSearch, @Nullable String overriddenPath) { - + var configuration = ConfigurationSettings.getCurrentState(); var builder = new OpenAIChatCompletionRequest.Builder( buildMessages(model, callParameters, useContextualSearch)) .setModel(model) - .setMaxTokens(ConfigurationState.getInstance().getMaxTokens()) + .setMaxTokens(configuration.getMaxTokens()) .setStream(true) - .setTemperature(ConfigurationState.getInstance().getTemperature()); + .setTemperature(configuration.getTemperature()); if (overriddenPath != null) { builder.setOverriddenPath(overriddenPath); @@ -183,7 +183,7 @@ public class CompletionRequestProvider { if (callParameters.getConversationType() == ConversationType.DEFAULT) { messages.add(new OpenAIChatCompletionMessage( "system", - ConfigurationState.getInstance().getSystemPrompt())); + ConfigurationSettings.getCurrentState().getSystemPrompt())); } if (callParameters.getConversationType() == ConversationType.FIX_COMPILE_ERRORS) { messages.add(new OpenAIChatCompletionMessage("system", FIX_COMPILE_ERRORS_SYSTEM_PROMPT)); @@ -213,7 +213,7 @@ public class CompletionRequestProvider { int totalUsage = messages.parallelStream() .mapToInt(encodingManager::countMessageTokens) - .sum() + ConfigurationState.getInstance().getMaxTokens(); + .sum() + ConfigurationSettings.getCurrentState().getMaxTokens(); int modelMaxTokens; try { modelMaxTokens = OpenAIChatCompletionModel.findByCode(model).getMaxTokens(); diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java index f27347e9..00048424 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java @@ -11,7 +11,7 @@ import ee.carlrobert.codegpt.codecompletions.CodeCompletionRequestProvider; import ee.carlrobert.codegpt.codecompletions.InfillRequestDetails; import ee.carlrobert.codegpt.credentials.AzureCredentialsManager; import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.settings.state.AzureSettingsState; import ee.carlrobert.codegpt.settings.state.OpenAISettingsState; import ee.carlrobert.codegpt.settings.state.SettingsState; @@ -89,10 +89,10 @@ public final class CompletionRequestService { public void generateCommitMessageAsync( String prompt, - CompletionEventListener eventListener) { + CompletionEventListener eventListener) { var request = new OpenAIChatCompletionRequest.Builder(List.of( new OpenAIChatCompletionMessage("system", - ConfigurationState.getInstance().getCommitMessagePrompt()), + ConfigurationSettings.getCurrentState().getCommitMessagePrompt()), new OpenAIChatCompletionMessage("user", prompt))) .setModel(OpenAISettingsState.getInstance().getModel()) .build(); diff --git a/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java b/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java index 88c817ef..3f0c6906 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java @@ -11,7 +11,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiUtilCore; import ee.carlrobert.codegpt.Icons; import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import java.util.Optional; import org.jetbrains.annotations.Nullable; @@ -20,10 +20,10 @@ public class MethodNameLookupListener implements LookupManagerListener { @Override public void activeLookupChanged(@Nullable Lookup oldLookup, @Nullable Lookup newLookup) { var application = ApplicationManager.getApplication(); - var configuration = ConfigurationState.getInstance(); + var configuration = ConfigurationSettings.getCurrentState(); var credentialsManager = OpenAICredentialsManager.getInstance(); - if (!configuration.isMethodRefactoringEnabled() + if (!configuration.isMethodNameGenerationEnabled() || !credentialsManager.isApiKeySet() || !(newLookup instanceof LookupImpl)) { return; diff --git a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationComponent.java b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationComponent.java index 2b4e188b..ed5f99b8 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationComponent.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationComponent.java @@ -103,7 +103,8 @@ public class ConfigurationComponent { systemPromptTextArea.setColumns(60); systemPromptTextArea.setRows(3); - commitMessagePromptTextArea = new JBTextArea(configuration.getCommitMessagePrompt(), 3, 60); + commitMessagePromptTextArea = new JBTextArea(configuration.getCommitMessagePrompt(), + 3, 60); commitMessagePromptTextArea.setLineWrap(true); commitMessagePromptTextArea.setBorder(JBUI.Borders.empty(8, 4)); @@ -115,7 +116,7 @@ public class ConfigurationComponent { configuration.isCreateNewChatOnEachAction()); methodNameGenerationCheckBox = new JBCheckBox( CodeGPTBundle.get("configurationConfigurable.enableMethodNameGeneration.label"), - configuration.isMethodRefactoringEnabled()); + configuration.isMethodNameGenerationEnabled()); autoFormattingCheckBox = new JBCheckBox( CodeGPTBundle.get("configurationConfigurable.autoFormatting.label"), configuration.isAutoFormattingEnabled()); @@ -142,7 +143,36 @@ public class ConfigurationComponent { return mainPanel; } - public Map getTableData() { + public ConfigurationState getCurrentFormState() { + var state = new ConfigurationState(); + state.setTableData(getTableData()); + state.setMaxTokens(maxTokensField.getValue()); + state.setTemperature(Double.parseDouble(temperatureField.getText())); + state.setSystemPrompt(systemPromptTextArea.getText()); + state.setCommitMessagePrompt(commitMessagePromptTextArea.getText()); + state.setCheckForPluginUpdates(checkForPluginUpdatesCheckBox.isSelected()); + state.setCreateNewChatOnEachAction(openNewTabCheckBox.isSelected()); + state.setMethodNameGenerationEnabled(methodNameGenerationCheckBox.isSelected()); + state.setAutoFormattingEnabled(autoFormattingCheckBox.isSelected()); + state.setCodeCompletionsEnabled( + ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled()); + return state; + } + + public void resetForm() { + var configuration = ConfigurationSettings.getCurrentState(); + setTableData(configuration.getTableData()); + maxTokensField.setValue(configuration.getMaxTokens()); + temperatureField.setText(String.valueOf(configuration.getTemperature())); + systemPromptTextArea.setText(configuration.getSystemPrompt()); + commitMessagePromptTextArea.setText(configuration.getCommitMessagePrompt()); + checkForPluginUpdatesCheckBox.setSelected(configuration.isCheckForPluginUpdates()); + openNewTabCheckBox.setSelected(configuration.isCreateNewChatOnEachAction()); + methodNameGenerationCheckBox.setSelected(configuration.isMethodNameGenerationEnabled()); + autoFormattingCheckBox.setSelected(configuration.isAutoFormattingEnabled()); + } + + private Map getTableData() { var model = getModel(); Map data = new LinkedHashMap<>(); for (int count = 0; count < model.getRowCount(); count++) { @@ -264,70 +294,6 @@ public class ConfigurationComponent { tableData.forEach((action, prompt) -> model.addRow(new Object[]{action, prompt})); } - public void setSystemPrompt(String systemPrompt) { - systemPromptTextArea.setText(systemPrompt); - } - - public String getSystemPrompt() { - return systemPromptTextArea.getText(); - } - - public void setCommitMessagePrompt(String commitMessagePrompt) { - commitMessagePromptTextArea.setText(commitMessagePrompt); - } - - public String getCommitMessagePrompt() { - return commitMessagePromptTextArea.getText(); - } - - public double getTemperature() { - return Double.parseDouble(temperatureField.getText()); - } - - public void setTemperature(double temperature) { - temperatureField.setText(String.valueOf(temperature)); - } - - public int getMaxTokens() { - return maxTokensField.getValue(); - } - - public void setMaxTokens(int maxTokens) { - maxTokensField.setValue(maxTokens); - } - - public boolean isCheckForPluginUpdates() { - return checkForPluginUpdatesCheckBox.isSelected(); - } - - public void setCheckForPluginUpdates(boolean checkForUpdates) { - checkForPluginUpdatesCheckBox.setSelected(checkForUpdates); - } - - public boolean isCreateNewChatOnEachAction() { - return openNewTabCheckBox.isSelected(); - } - - public void setCreateNewChatOnEachAction(boolean createNewChatOnEachAction) { - openNewTabCheckBox.setSelected(createNewChatOnEachAction); - } - - public boolean isMethodNameGenerationEnabled() { - return methodNameGenerationCheckBox.isSelected(); - } - - public void setDisableMethodNameGeneration(boolean disableMethodNameGeneration) { - methodNameGenerationCheckBox.setSelected(disableMethodNameGeneration); - } - - public boolean isAutoFormattingEnabled() { - return autoFormattingCheckBox.isSelected(); - } - - public void setAutoFormattingEnabled(boolean enabled) { - autoFormattingCheckBox.setSelected(enabled); - } - class RevertToDefaultsActionButton extends AnActionButton { RevertToDefaultsActionButton() { diff --git a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationConfigurable.java b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationConfigurable.java index baa62886..5f39d48b 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationConfigurable.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationConfigurable.java @@ -4,7 +4,6 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.util.Disposer; import ee.carlrobert.codegpt.CodeGPTBundle; -import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; import javax.swing.JComponent; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.Nullable; @@ -24,63 +23,27 @@ public class ConfigurationConfigurable implements Configurable { @Nullable @Override public JComponent createComponent() { - var configuration = ConfigurationState.getInstance(); parentDisposable = Disposer.newDisposable(); - configurationComponent = new ConfigurationComponent(parentDisposable, configuration); + configurationComponent = new ConfigurationComponent( + parentDisposable, + ConfigurationSettings.getCurrentState()); return configurationComponent.getPanel(); } @Override public boolean isModified() { - var configuration = ConfigurationState.getInstance(); - return !configurationComponent.getTableData().equals(configuration.getTableData()) - || configurationComponent.getMaxTokens() != configuration.getMaxTokens() - || configurationComponent.getTemperature() != configuration.getTemperature() - || !configurationComponent.getSystemPrompt().equals(configuration.getSystemPrompt()) - || !configurationComponent.getCommitMessagePrompt() - .equals(configuration.getCommitMessagePrompt()) - || configurationComponent.isCheckForPluginUpdates() - != configuration.isCheckForPluginUpdates() - || configurationComponent.isCreateNewChatOnEachAction() - != configuration.isCreateNewChatOnEachAction() - || configurationComponent.isMethodNameGenerationEnabled() - != configuration.isMethodRefactoringEnabled() - || configurationComponent.isAutoFormattingEnabled() - != configuration.isAutoFormattingEnabled(); + return !configurationComponent.getCurrentFormState() + .equals(ConfigurationSettings.getCurrentState()); } @Override public void apply() { - var configuration = ConfigurationState.getInstance(); - configuration.setTableData(configurationComponent.getTableData()); - configuration.setMaxTokens(configurationComponent.getMaxTokens()); - configuration.setTemperature(configurationComponent.getTemperature()); - configuration.setSystemPrompt(configurationComponent.getSystemPrompt()); - configuration.setCommitMessagePrompt(configurationComponent.getCommitMessagePrompt()); - configuration.setCheckForPluginUpdates(configurationComponent.isCheckForPluginUpdates()); - configuration.setCreateNewChatOnEachAction( - configurationComponent.isCreateNewChatOnEachAction()); - configuration.setMethodNameGenerationEnabled( - configurationComponent.isMethodNameGenerationEnabled()); - configuration.setAutoFormattingEnabled(configurationComponent.isAutoFormattingEnabled()); - EditorActionsUtil.refreshActions(); + ConfigurationSettings.getInstance().loadState(configurationComponent.getCurrentFormState()); } @Override public void reset() { - var configuration = ConfigurationState.getInstance(); - configurationComponent.setTableData(configuration.getTableData()); - configurationComponent.setMaxTokens(configuration.getMaxTokens()); - configurationComponent.setTemperature(configuration.getTemperature()); - configurationComponent.setSystemPrompt(configuration.getSystemPrompt()); - configurationComponent.setCommitMessagePrompt(configuration.getCommitMessagePrompt()); - configurationComponent.setCheckForPluginUpdates(configuration.isCheckForPluginUpdates()); - configurationComponent.setCreateNewChatOnEachAction( - configuration.isCreateNewChatOnEachAction()); - configurationComponent.setDisableMethodNameGeneration( - configuration.isMethodRefactoringEnabled()); - configurationComponent.setAutoFormattingEnabled(configuration.isAutoFormattingEnabled()); - EditorActionsUtil.refreshActions(); + configurationComponent.resetForm(); } @Override diff --git a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationSettings.java b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationSettings.java new file mode 100644 index 00000000..abcce780 --- /dev/null +++ b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationSettings.java @@ -0,0 +1,34 @@ +package ee.carlrobert.codegpt.settings.configuration; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.Storage; +import org.jetbrains.annotations.NotNull; + +@State( + name = "CodeGPT_ConfigurationSettings_210", + storages = @Storage("CodeGPT_ConfigurationSettings_210.xml")) +public class ConfigurationSettings implements PersistentStateComponent { + + private ConfigurationState state = new ConfigurationState(); + + @Override + @NotNull + public ConfigurationState getState() { + return state; + } + + @Override + public void loadState(@NotNull ConfigurationState state) { + this.state = state; + } + + public static ConfigurationState getCurrentState() { + return getInstance().getState(); + } + + public static ConfigurationSettings getInstance() { + return ApplicationManager.getApplication().getService(ConfigurationSettings.class); + } +} diff --git a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationState.java b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationState.java index c627b45d..7ae70912 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationState.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationState.java @@ -3,20 +3,11 @@ package ee.carlrobert.codegpt.settings.configuration; import static ee.carlrobert.codegpt.completions.CompletionRequestProvider.COMPLETION_SYSTEM_PROMPT; import static ee.carlrobert.codegpt.completions.CompletionRequestProvider.GENERATE_COMMIT_MESSAGE_SYSTEM_PROMPT; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.PersistentStateComponent; -import com.intellij.openapi.components.State; -import com.intellij.openapi.components.Storage; -import com.intellij.util.xmlb.XmlSerializerUtil; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; import java.util.Map; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import java.util.Objects; -@State( - name = "CodeGPT_ConfigurationSettings_210", - storages = @Storage("CodeGPT_ConfigurationSettings_210.xml")) -public class ConfigurationState implements PersistentStateComponent { +public class ConfigurationState { private String systemPrompt = COMPLETION_SYSTEM_PROMPT; private String commitMessagePrompt = GENERATE_COMMIT_MESSAGE_SYSTEM_PROMPT; @@ -31,21 +22,6 @@ public class ConfigurationState implements PersistentStateComponent tableData = EditorActionsUtil.DEFAULT_ACTIONS; - public static ConfigurationState getInstance() { - return ApplicationManager.getApplication().getService(ConfigurationState.class); - } - - @Nullable - @Override - public ConfigurationState getState() { - return this; - } - - @Override - public void loadState(@NotNull ConfigurationState state) { - XmlSerializerUtil.copyBean(state, this); - } - public String getSystemPrompt() { return systemPrompt; } @@ -110,7 +86,7 @@ public class ConfigurationState implements PersistentStateComponent - + diff --git a/src/test/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionServiceTest.java b/src/test/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionServiceTest.java index 77fa7ed7..7d0bbfcb 100644 --- a/src/test/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionServiceTest.java +++ b/src/test/java/ee/carlrobert/codegpt/codecompletions/CodeCompletionServiceTest.java @@ -12,7 +12,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.VisualPosition; import com.intellij.openapi.util.TextRange; import com.intellij.testFramework.PlatformTestUtil; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.llm.client.http.exchange.StreamHttpExchange; import java.util.List; import testsupport.IntegrationTest; @@ -23,7 +23,7 @@ public class CodeCompletionServiceTest extends IntegrationTest { public void testFetchCodeCompletionLlama() { useLlamaService(); - ConfigurationState.getInstance().setCodeCompletionsEnabled(true); + ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(true); myFixture.configureByText( "CompletionTest.java", getResourceContent("/codecompletions/code-completion-file.txt")); @@ -61,7 +61,7 @@ public class CodeCompletionServiceTest extends IntegrationTest { } public void testApplyInlayAction() { - ConfigurationState.getInstance().setAutoFormattingEnabled(false); + ConfigurationSettings.getCurrentState().setAutoFormattingEnabled(false); myFixture.configureByText( "CompletionTest.java", getResourceContent("/codecompletions/code-completion-file.txt")); diff --git a/src/test/java/ee/carlrobert/codegpt/completions/CompletionRequestProviderTest.java b/src/test/java/ee/carlrobert/codegpt/completions/CompletionRequestProviderTest.java index ded8e9b1..dc54e872 100644 --- a/src/test/java/ee/carlrobert/codegpt/completions/CompletionRequestProviderTest.java +++ b/src/test/java/ee/carlrobert/codegpt/completions/CompletionRequestProviderTest.java @@ -12,7 +12,7 @@ import static org.assertj.core.groups.Tuple.tuple; import ee.carlrobert.codegpt.conversations.ConversationService; import ee.carlrobert.codegpt.conversations.message.Message; import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.settings.state.OpenAISettingsState; import ee.carlrobert.llm.client.http.ResponseEntity; import ee.carlrobert.llm.client.http.exchange.BasicHttpExchange; @@ -26,7 +26,7 @@ public class CompletionRequestProviderTest extends IntegrationTest { public void testChatCompletionRequestWithSystemPromptOverride() { OpenAICredentialsManager.getInstance().setApiKey("TEST_API_KEY"); OpenAISettingsState.getInstance().setBaseHost(null); - ConfigurationState.getInstance().setSystemPrompt("TEST_SYSTEM_PROMPT"); + ConfigurationSettings.getCurrentState().setSystemPrompt("TEST_SYSTEM_PROMPT"); var conversation = ConversationService.getInstance().startConversation(); var firstMessage = createDummyMessage(500); var secondMessage = createDummyMessage(250); @@ -85,7 +85,7 @@ public class CompletionRequestProviderTest extends IntegrationTest { } public void testChatCompletionRequestRetry() { - ConfigurationState.getInstance().setSystemPrompt(COMPLETION_SYSTEM_PROMPT); + ConfigurationSettings.getCurrentState().setSystemPrompt(COMPLETION_SYSTEM_PROMPT); var conversation = ConversationService.getInstance().startConversation(); var firstMessage = createDummyMessage("FIRST_TEST_PROMPT", 500); var secondMessage = createDummyMessage("SECOND_TEST_PROMPT", 250); diff --git a/src/test/java/ee/carlrobert/codegpt/completions/DefaultCompletionRequestHandlerTest.java b/src/test/java/ee/carlrobert/codegpt/completions/DefaultCompletionRequestHandlerTest.java index c4dc5537..29a83760 100644 --- a/src/test/java/ee/carlrobert/codegpt/completions/DefaultCompletionRequestHandlerTest.java +++ b/src/test/java/ee/carlrobert/codegpt/completions/DefaultCompletionRequestHandlerTest.java @@ -12,10 +12,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; import ee.carlrobert.codegpt.CodeGPTPlugin; -import ee.carlrobert.codegpt.conversations.Conversation; import ee.carlrobert.codegpt.conversations.ConversationService; import ee.carlrobert.codegpt.conversations.message.Message; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.settings.state.AzureSettingsState; import ee.carlrobert.llm.client.http.exchange.StreamHttpExchange; import java.util.List; @@ -180,7 +179,7 @@ public class DefaultCompletionRequestHandlerTest extends IntegrationTest { public void testLlamaChatCompletionCall() { useLlamaService(); - ConfigurationState.getInstance().setMaxTokens(99); + ConfigurationSettings.getCurrentState().setMaxTokens(99); var message = new Message("TEST_PROMPT"); var conversation = ConversationService.getInstance().startConversation(); conversation.addMessage(new Message("Ping", "Pong")); diff --git a/src/test/java/ee/carlrobert/codegpt/toolwindow/chat/StandardChatToolWindowTabPanelTest.java b/src/test/java/ee/carlrobert/codegpt/toolwindow/chat/StandardChatToolWindowTabPanelTest.java index 2d52fdba..336faa05 100644 --- a/src/test/java/ee/carlrobert/codegpt/toolwindow/chat/StandardChatToolWindowTabPanelTest.java +++ b/src/test/java/ee/carlrobert/codegpt/toolwindow/chat/StandardChatToolWindowTabPanelTest.java @@ -18,7 +18,7 @@ import ee.carlrobert.codegpt.completions.ConversationType; import ee.carlrobert.codegpt.completions.HuggingFaceModel; import ee.carlrobert.codegpt.conversations.ConversationService; import ee.carlrobert.codegpt.conversations.message.Message; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.settings.state.LlamaSettingsState; import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowTabPanel; import ee.carlrobert.embedding.ReferencedFile; @@ -31,7 +31,7 @@ public class StandardChatToolWindowTabPanelTest extends IntegrationTest { public void testSendingOpenAIMessage() { useOpenAIService(); - ConfigurationState.getInstance().setSystemPrompt(COMPLETION_SYSTEM_PROMPT); + ConfigurationSettings.getCurrentState().setSystemPrompt(COMPLETION_SYSTEM_PROMPT); var message = new Message("Hello!"); var conversation = ConversationService.getInstance().startConversation(); var panel = new StandardChatToolWindowTabPanel(getProject(), conversation); @@ -94,7 +94,7 @@ public class StandardChatToolWindowTabPanelTest extends IntegrationTest { new ReferencedFile("TEST_FILE_NAME_2", "TEST_FILE_PATH_2", "TEST_FILE_CONTENT_2"), new ReferencedFile("TEST_FILE_NAME_3", "TEST_FILE_PATH_3", "TEST_FILE_CONTENT_3"))); useOpenAIService(); - ConfigurationState.getInstance().setSystemPrompt(COMPLETION_SYSTEM_PROMPT); + ConfigurationSettings.getCurrentState().setSystemPrompt(COMPLETION_SYSTEM_PROMPT); var message = new Message("TEST_MESSAGE"); message.setUserMessage("TEST_MESSAGE"); message.setReferencedFilePaths( @@ -181,7 +181,7 @@ public class StandardChatToolWindowTabPanelTest extends IntegrationTest { new ReferencedFile("TEST_FILE_NAME_2", "TEST_FILE_PATH_2", "TEST_FILE_CONTENT_2"), new ReferencedFile("TEST_FILE_NAME_3", "TEST_FILE_PATH_3", "TEST_FILE_CONTENT_3"))); useOpenAIService(); - ConfigurationState.getInstance().setSystemPrompt(COMPLETION_SYSTEM_PROMPT); + ConfigurationSettings.getCurrentState().setSystemPrompt(COMPLETION_SYSTEM_PROMPT); var message = new Message("TEST_MESSAGE"); message.setUserMessage("TEST_MESSAGE"); message.setReferencedFilePaths( @@ -264,7 +264,7 @@ public class StandardChatToolWindowTabPanelTest extends IntegrationTest { public void testSendingLlamaMessage() { useLlamaService(); - var configurationState = ConfigurationState.getInstance(); + var configurationState = ConfigurationSettings.getCurrentState(); configurationState.setSystemPrompt(COMPLETION_SYSTEM_PROMPT); configurationState.setMaxTokens(1000); configurationState.setTemperature(0.1); diff --git a/src/test/java/testsupport/IntegrationTest.java b/src/test/java/testsupport/IntegrationTest.java index df652668..99f19d73 100644 --- a/src/test/java/testsupport/IntegrationTest.java +++ b/src/test/java/testsupport/IntegrationTest.java @@ -6,7 +6,7 @@ import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.testFramework.fixtures.BasePlatformTestCase; import ee.carlrobert.codegpt.CodeGPTKeys; import ee.carlrobert.codegpt.codecompletions.CodeGPTEditorManager; -import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; +import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.llm.client.mixin.ExternalServiceTestMixin; import java.util.Collections; import testsupport.mixin.ShortcutsTestMixin; @@ -22,7 +22,7 @@ public class IntegrationTest extends BasePlatformTestCase implements @Override protected void tearDown() throws Exception { ExternalServiceTestMixin.clearAll(); - ConfigurationState.getInstance().setCodeCompletionsEnabled(false); + ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(false); CodeGPTEditorManager.getInstance().disposeAllInlays(getProject()); ActionManager.getInstance().unregisterAction(APPLY_INLAY_ACTION_ID); getProject().putUserData(CodeGPTKeys.SELECTED_FILES, Collections.emptyList());