diff --git a/build.gradle.kts b/build.gradle.kts index 9198136a..87104ec0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -59,7 +59,6 @@ dependencies { implementation("org.jsoup:jsoup:1.16.2") implementation("org.apache.commons:commons-text:1.11.0") implementation("com.knuddels:jtokkit:0.6.1") - implementation("org.quartz-scheduler:quartz:2.3.2") testImplementation("org.assertj:assertj-core:3.24.2") testImplementation("org.awaitility:awaitility:4.2.0") diff --git a/codegpt-telemetry/src/main/java/ee/carlrobert/codegpt/telemetry/ui/utils/JBLabelUtils.java b/codegpt-telemetry/src/main/java/ee/carlrobert/codegpt/telemetry/ui/utils/JBLabelUtils.java index c99aecbf..8ce9ebe9 100644 --- a/codegpt-telemetry/src/main/java/ee/carlrobert/codegpt/telemetry/ui/utils/JBLabelUtils.java +++ b/codegpt-telemetry/src/main/java/ee/carlrobert/codegpt/telemetry/ui/utils/JBLabelUtils.java @@ -81,5 +81,4 @@ public class JBLabelUtils { } return ColorUtil.toHex(color); } - } diff --git a/src/main/java/ee/carlrobert/codegpt/PluginStartupActivity.java b/src/main/java/ee/carlrobert/codegpt/PluginStartupActivity.java index 2ae3f55e..f0895aaa 100644 --- a/src/main/java/ee/carlrobert/codegpt/PluginStartupActivity.java +++ b/src/main/java/ee/carlrobert/codegpt/PluginStartupActivity.java @@ -3,79 +3,29 @@ package ee.carlrobert.codegpt; import com.intellij.notification.NotificationType; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.project.ProjectManagerListener; import com.intellij.openapi.startup.StartupActivity; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; -import ee.carlrobert.codegpt.completions.CompletionLookupService; import ee.carlrobert.codegpt.completions.you.YouUserManager; import ee.carlrobert.codegpt.completions.you.auth.AuthenticationHandler; -import ee.carlrobert.codegpt.completions.you.auth.SessionVerificationJob; import ee.carlrobert.codegpt.completions.you.auth.YouAuthenticationError; import ee.carlrobert.codegpt.completions.you.auth.YouAuthenticationService; import ee.carlrobert.codegpt.completions.you.auth.response.YouAuthenticationResponse; import ee.carlrobert.codegpt.credentials.YouCredentialsManager; import ee.carlrobert.codegpt.settings.state.SettingsState; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; import org.jetbrains.annotations.NotNull; -import org.quartz.JobBuilder; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.SimpleScheduleBuilder; -import org.quartz.TriggerBuilder; -import org.quartz.impl.StdSchedulerFactory; public class PluginStartupActivity implements StartupActivity { private static final Logger LOG = Logger.getInstance(PluginStartupActivity.class); - private Scheduler scheduler; @Override public void runActivity(@NotNull Project project) { - project.getService(CompletionLookupService.class).subscribeToLookupTopic(); EditorActionsUtil.refreshActions(); var authenticationResponse = YouUserManager.getInstance().getAuthenticationResponse(); if (authenticationResponse == null) { handleYouServiceAuthentication(); - } else { - startSessionVerificationJob(); - } - - ProjectManager.getInstance().addProjectManagerListener(project, new ProjectManagerListener() { - @Override - public void projectClosing(@NotNull Project project) { - if (scheduler != null) { - try { - scheduler.shutdown(); - } catch (SchedulerException e) { - LOG.error("Could not shut down scheduler.", e); - } - } - } - }); - } - - private void startSessionVerificationJob() { - try { - scheduler = StdSchedulerFactory.getDefaultScheduler(); - scheduler.start(); - - var job = JobBuilder.newJob(SessionVerificationJob.class) - .withIdentity("authenticationVerifierJob", "authenticationVerifier") - .build(); - var trigger = TriggerBuilder.newTrigger() - .forJob(job) - .withIdentity("authenticationVerifierTrigger", "authenticationVerifier") - .withSchedule(SimpleScheduleBuilder.simpleSchedule() - .withIntervalInMinutes(30) - .repeatForever()) - .startNow() - .build(); - - scheduler.scheduleJob(job, trigger); - } catch (SchedulerException e) { - LOG.error("Couldn't start authentication verifier job", e); } } @@ -91,22 +41,21 @@ public class PluginStartupActivity implements StartupActivity { .signInAsync(settings.getEmail(), password, new AuthenticationHandler() { @Override public void handleAuthenticated(YouAuthenticationResponse authenticationResponse) { - OverlayUtils.showNotification( + OverlayUtil.showNotification( "Authentication successful.", NotificationType.INFORMATION); - startSessionVerificationJob(); } @Override public void handleGenericError() { - OverlayUtils.showNotification( + OverlayUtil.showNotification( "Something went wrong while trying to authenticate.", NotificationType.ERROR); } @Override public void handleError(YouAuthenticationError youAuthenticationError) { - OverlayUtils.showNotification( + OverlayUtil.showNotification( youAuthenticationError.getErrorMessage(), NotificationType.ERROR); } diff --git a/src/main/java/ee/carlrobert/codegpt/actions/GenerateGitCommitMessageAction.java b/src/main/java/ee/carlrobert/codegpt/actions/GenerateGitCommitMessageAction.java index 792736a0..f50fffe2 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/GenerateGitCommitMessageAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/GenerateGitCommitMessageAction.java @@ -2,7 +2,7 @@ package ee.carlrobert.codegpt.actions; import static com.intellij.openapi.ui.Messages.OK; import static com.intellij.util.ObjectUtils.tryCast; -import static ee.carlrobert.codegpt.util.file.FileUtils.getResourceContent; +import static ee.carlrobert.codegpt.util.file.FileUtil.getResourceContent; import static java.util.stream.Collectors.joining; import com.intellij.notification.Notification; @@ -24,7 +24,7 @@ import ee.carlrobert.codegpt.Icons; import ee.carlrobert.codegpt.completions.CompletionClientProvider; import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager; import ee.carlrobert.codegpt.settings.state.OpenAISettingsState; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; import ee.carlrobert.llm.client.openai.completion.ErrorDetails; import ee.carlrobert.llm.client.openai.completion.chat.request.OpenAIChatCompletionMessage; import ee.carlrobert.llm.client.openai.completion.chat.request.OpenAIChatCompletionRequest; @@ -66,7 +66,7 @@ public class GenerateGitCommitMessageAction extends AnAction { var gitDiff = getGitDiff(project); var tokenCount = encodingManager.countTokens(gitDiff); - if (tokenCount > 4096 && OverlayUtils.showTokenSoftLimitWarningDialog(tokenCount) != OK) { + if (tokenCount > 4096 && OverlayUtil.showTokenSoftLimitWarningDialog(tokenCount) != OK) { return; } diff --git a/src/main/java/ee/carlrobert/codegpt/actions/editor/CustomPromptAction.java b/src/main/java/ee/carlrobert/codegpt/actions/editor/CustomPromptAction.java index 9c0fe624..a77a7233 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/editor/CustomPromptAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/editor/CustomPromptAction.java @@ -12,8 +12,10 @@ import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UI; import ee.carlrobert.codegpt.conversations.message.Message; import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager; -import ee.carlrobert.codegpt.util.SwingUtils; -import ee.carlrobert.codegpt.util.file.FileUtils; +import ee.carlrobert.codegpt.util.UIUtil; +import ee.carlrobert.codegpt.util.file.FileUtil; +import java.awt.event.ActionEvent; +import javax.swing.AbstractAction; import javax.swing.JComponent; import javax.swing.JTextArea; import javax.swing.SwingUtilities; @@ -32,7 +34,7 @@ class CustomPromptAction extends BaseEditorAction { protected void actionPerformed(Project project, Editor editor, String selectedText) { if (selectedText != null && !selectedText.isEmpty()) { var fileExtension = - FileUtils.getFileExtension(((EditorImpl) editor).getVirtualFile().getName()); + FileUtil.getFileExtension(((EditorImpl) editor).getVirtualFile().getName()); var dialog = new CustomPromptDialog(previousUserPrompt); if (dialog.showAndGet()) { previousUserPrompt = dialog.getUserPrompt(); @@ -69,7 +71,12 @@ class CustomPromptAction extends BaseEditorAction { userPromptTextArea.setLineWrap(true); userPromptTextArea.setWrapStyleWord(true); userPromptTextArea.setMargin(JBUI.insets(5)); - SwingUtils.addShiftEnterInputMap(userPromptTextArea, this::clickDefaultButton); + UIUtil.addShiftEnterInputMap(userPromptTextArea, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + clickDefaultButton(); + } + }); return FormBuilder.createFormBuilder() .addComponent(UI.PanelFactory.panel(userPromptTextArea) 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 366f60fc..9196b2ea 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/editor/EditorActionsUtil.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/editor/EditorActionsUtil.java @@ -13,7 +13,7 @@ import com.intellij.openapi.project.Project; import ee.carlrobert.codegpt.conversations.message.Message; import ee.carlrobert.codegpt.settings.configuration.ConfigurationState; import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager; -import ee.carlrobert.codegpt.util.file.FileUtils; +import ee.carlrobert.codegpt.util.file.FileUtil; import java.util.LinkedHashMap; import java.util.Map; import org.apache.commons.text.CaseUtils; @@ -55,7 +55,7 @@ public class EditorActionsUtil { var action = new BaseEditorAction(label, label) { @Override protected void actionPerformed(Project project, Editor editor, String selectedText) { - var fileExtension = FileUtils.getFileExtension( + var fileExtension = FileUtil.getFileExtension( ((EditorImpl) editor).getVirtualFile().getName()); var message = new Message(prompt.replace( "{{selectedCode}}", diff --git a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteConversationAction.java b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteConversationAction.java index 2ec82e39..a6bb8610 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteConversationAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/DeleteConversationAction.java @@ -8,7 +8,7 @@ import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; import ee.carlrobert.codegpt.conversations.ConversationsState; import ee.carlrobert.codegpt.telemetry.TelemetryAction; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; import org.jetbrains.annotations.NotNull; public class DeleteConversationAction extends AnAction { @@ -28,7 +28,7 @@ public class DeleteConversationAction extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent event) { - if (OverlayUtils.showDeleteConversationDialog() == Messages.YES) { + if (OverlayUtil.showDeleteConversationDialog() == Messages.YES) { var project = event.getProject(); if (project != null) { TelemetryAction.IDE_ACTION.createActionMessage() diff --git a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/ReplaceCodeInMainEditorAction.java b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/ReplaceCodeInMainEditorAction.java index a253daef..5bcd92cf 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/ReplaceCodeInMainEditorAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/toolwindow/ReplaceCodeInMainEditorAction.java @@ -7,7 +7,7 @@ import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.PlatformDataKeys; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; -import ee.carlrobert.codegpt.util.EditorUtils; +import ee.carlrobert.codegpt.util.EditorUtil; import org.jetbrains.annotations.NotNull; public class ReplaceCodeInMainEditorAction extends AnAction { @@ -20,8 +20,8 @@ public class ReplaceCodeInMainEditorAction extends AnAction { @Override public void update(@NotNull AnActionEvent event) { event.getPresentation().setEnabled( - EditorUtils.isMainEditorTextSelected(requireNonNull(event.getProject())) - && EditorUtils.hasSelection(event.getData(PlatformDataKeys.EDITOR))); + EditorUtil.isMainEditorTextSelected(requireNonNull(event.getProject())) + && EditorUtil.hasSelection(event.getData(PlatformDataKeys.EDITOR))); } @Override @@ -29,7 +29,7 @@ public class ReplaceCodeInMainEditorAction extends AnAction { var project = event.getProject(); var toolWindowEditor = event.getData(PlatformDataKeys.EDITOR); if (project != null && toolWindowEditor != null) { - EditorUtils.replaceMainEditorSelection( + EditorUtil.replaceMainEditorSelection( project, requireNonNull(toolWindowEditor.getSelectionModel().getSelectedText())); } diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionLookupService.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionLookupService.java deleted file mode 100644 index 3bb90a84..00000000 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionLookupService.java +++ /dev/null @@ -1,99 +0,0 @@ -package ee.carlrobert.codegpt.completions; - -import com.intellij.codeInsight.completion.PrefixMatcher; -import com.intellij.codeInsight.lookup.LookupElementBuilder; -import com.intellij.codeInsight.lookup.LookupManagerListener; -import com.intellij.codeInsight.lookup.impl.LookupImpl; -import com.intellij.openapi.application.Application; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.Service; -import com.intellij.openapi.project.Project; -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.state.SettingsState; -import java.util.Optional; -import org.jetbrains.annotations.Nullable; - -@Service(Service.Level.PROJECT) -public final class CompletionLookupService { - - private final Project project; - - private CompletionLookupService(Project project) { - this.project = project; - } - - public void subscribeToLookupTopic() { - project.getMessageBus() - .connect() - .subscribe(LookupManagerListener.TOPIC, getLookupManagerListener()); - } - - private @Nullable String getCompletionResponse(String prompt) { - var selectedService = SettingsState.getInstance().getSelectedService(); - switch (selectedService) { - case OPENAI: - case AZURE: - return Optional.ofNullable(CompletionClientProvider.getOpenAIClient() - .getChatCompletion( - CompletionRequestProvider.buildOpenAILookupCompletionRequest(prompt)) - .getChoices()) - .map(choices -> choices.get(0).getMessage().getContent()) - .orElse(null); - // TODO - /*case LLAMA_CPP: - var request = CompletionRequestProvider.buildLlamaLookupCompletionRequest(prompt); - return CompletionClientProvider.getLlamaClient() - .getChatCompletion(request) - .getContent();*/ - default: - return null; - } - } - - private void addCompletionLookupValues( - LookupImpl lookup, - Application application, - String prompt) { - Optional.ofNullable(getCompletionResponse(prompt)) - .ifPresent(response -> { - for (var value : response.split(",")) { - application.runReadAction(() -> { - lookup.addItem( - LookupElementBuilder.create(value.trim()).withIcon(Icons.SparkleIcon), - PrefixMatcher.ALWAYS_TRUE); - }); - application.invokeLater(() -> lookup.refreshUi(true, true)); - } - }); - } - - private LookupManagerListener getLookupManagerListener() { - var application = ApplicationManager.getApplication(); - var configuration = ConfigurationState.getInstance(); - var credentialsManager = OpenAICredentialsManager.getInstance(); - return (oldLookup, newLookup) -> { - if (!configuration.isMethodNameGenerationEnabled() - || !credentialsManager.isApiKeySet() - || !(newLookup instanceof LookupImpl)) { - return; - } - - var lookup = (LookupImpl) newLookup; - Optional.ofNullable(lookup.getPsiElement()) - .map(PsiElement::getContext) - .ifPresent(context -> - application.runReadAction(() -> { - var type = PsiUtilCore.getElementType(context); - if ("METHOD".equals(type.toString())) { - var selection = context.getText(); - application.executeOnPooledThread( - () -> addCompletionLookupValues(lookup, application, selection)); - } - })); - }; - } -} diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java index f3aa8156..47a34bbb 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java @@ -1,6 +1,6 @@ package ee.carlrobert.codegpt.completions; -import static ee.carlrobert.codegpt.util.file.FileUtils.getResourceContent; +import static ee.carlrobert.codegpt.util.file.FileUtil.getResourceContent; import static java.util.stream.Collectors.toList; import com.intellij.openapi.application.ApplicationManager; diff --git a/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java b/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java new file mode 100644 index 00000000..89b82a7b --- /dev/null +++ b/src/main/java/ee/carlrobert/codegpt/completions/MethodNameLookupListener.java @@ -0,0 +1,79 @@ +package ee.carlrobert.codegpt.completions; + +import static ee.carlrobert.codegpt.settings.service.ServiceType.AZURE; +import static ee.carlrobert.codegpt.settings.service.ServiceType.OPENAI; + +import com.intellij.codeInsight.completion.PrefixMatcher; +import com.intellij.codeInsight.lookup.Lookup; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.codeInsight.lookup.LookupManagerListener; +import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; +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.state.SettingsState; +import java.util.Optional; +import org.jetbrains.annotations.Nullable; + +public class MethodNameLookupListener implements LookupManagerListener { + + @Override + public void activeLookupChanged(@Nullable Lookup oldLookup, @Nullable Lookup newLookup) { + var application = ApplicationManager.getApplication(); + var configuration = ConfigurationState.getInstance(); + var credentialsManager = OpenAICredentialsManager.getInstance(); + + if (!configuration.isMethodRefactoringEnabled() + || !credentialsManager.isApiKeySet() + || !(newLookup instanceof LookupImpl)) { + return; + } + + var lookup = (LookupImpl) newLookup; + Optional.ofNullable(lookup.getPsiElement()) + .map(PsiElement::getContext) + .ifPresent(context -> + application.runReadAction(() -> { + var type = PsiUtilCore.getElementType(context); + if ("METHOD".equals(type.toString())) { + var selection = context.getText(); + application.executeOnPooledThread(() -> + addCompletionLookupValues(lookup, application, selection)); + } + })); + } + + private void addCompletionLookupValues( + LookupImpl lookup, + Application application, + String prompt) { + Optional.ofNullable(getCompletionResponse(prompt)) + .ifPresent(response -> { + for (var value : response.split(",")) { + application.runReadAction(() -> { + lookup.addItem( + LookupElementBuilder.create(value.trim()).withIcon(Icons.SparkleIcon), + PrefixMatcher.ALWAYS_TRUE); + }); + application.invokeLater(() -> lookup.refreshUi(true, true)); + } + }); + } + + private @Nullable String getCompletionResponse(String prompt) { + var selectedService = SettingsState.getInstance().getSelectedService(); + if (selectedService == OPENAI || selectedService == AZURE) { + return Optional.ofNullable(CompletionClientProvider.getOpenAIClient() + .getChatCompletion( + CompletionRequestProvider.buildOpenAILookupCompletionRequest(prompt)) + .getChoices()) + .map(choices -> choices.get(0).getMessage().getContent()) + .orElse(null); + } + return null; + } +} diff --git a/src/main/java/ee/carlrobert/codegpt/completions/llama/LlamaServerAgent.java b/src/main/java/ee/carlrobert/codegpt/completions/llama/LlamaServerAgent.java index 711a5cb1..6ce085a5 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/llama/LlamaServerAgent.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/llama/LlamaServerAgent.java @@ -16,6 +16,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; import com.intellij.ui.components.JBLabel; import ee.carlrobert.codegpt.CodeGPTPlugin; +import ee.carlrobert.codegpt.settings.service.LlamaServiceSelectionForm; import ee.carlrobert.codegpt.settings.service.ServerProgressPanel; import ee.carlrobert.codegpt.settings.state.LlamaSettingsState; import java.nio.charset.StandardCharsets; @@ -32,10 +33,7 @@ public final class LlamaServerAgent implements Disposable { private static @Nullable OSProcessHandler startServerProcessHandler; public void startAgent( - String modelPath, - int contextLength, - int threads, - int port, + LlamaServiceSelectionForm llamaServiceSelectionForm, ServerProgressPanel serverProgressPanel, Runnable onSuccess) { ApplicationManager.getApplication().invokeLater(() -> { @@ -43,13 +41,7 @@ public final class LlamaServerAgent implements Disposable { serverProgressPanel.updateText("Building llama.cpp..."); makeProcessHandler = new OSProcessHandler(getMakeCommandLinde()); makeProcessHandler.addProcessListener( - getMakeProcessListener( - modelPath, - contextLength, - threads, - port, - serverProgressPanel, - onSuccess)); + getMakeProcessListener(llamaServiceSelectionForm, serverProgressPanel, onSuccess)); makeProcessHandler.startNotify(); } catch (ExecutionException e) { throw new RuntimeException(e); @@ -70,10 +62,7 @@ public final class LlamaServerAgent implements Disposable { } private ProcessListener getMakeProcessListener( - String modelPath, - int contextLength, - int threads, - int port, + LlamaServiceSelectionForm serviceSelectionForm, ServerProgressPanel serverProgressPanel, Runnable onSuccess) { return new ProcessAdapter() { @@ -87,9 +76,15 @@ public final class LlamaServerAgent implements Disposable { try { serverProgressPanel.updateText("Booting up server..."); startServerProcessHandler = new OSProcessHandler( - getServerCommandLine(modelPath, contextLength, threads, port)); - startServerProcessHandler.addProcessListener( - getProcessListener(port, serverProgressPanel, onSuccess)); + getServerCommandLine( + serviceSelectionForm.getLlamaModelPreferencesForm().getActualModelPath(), + serviceSelectionForm.getContextSize(), + serviceSelectionForm.getThreads(), + serviceSelectionForm.getServerPort())); + startServerProcessHandler.addProcessListener(getProcessListener( + serviceSelectionForm.getServerPort(), + serverProgressPanel, + onSuccess)); startServerProcessHandler.startNotify(); } catch (ExecutionException e) { throw new RuntimeException(e); @@ -142,10 +137,10 @@ public final class LlamaServerAgent implements Disposable { } private GeneralCommandLine getServerCommandLine( - String modelPath, - int contextLength, - int threads, - int port) { + String modelPath, + int contextLength, + int threads, + int port) { GeneralCommandLine commandLine = new GeneralCommandLine().withCharset(StandardCharsets.UTF_8); commandLine.setExePath("./server"); commandLine.withWorkDirectory(CodeGPTPlugin.getLlamaSourcePath()); diff --git a/src/main/java/ee/carlrobert/codegpt/completions/you/auth/SessionVerificationJob.java b/src/main/java/ee/carlrobert/codegpt/completions/you/auth/SessionVerificationJob.java deleted file mode 100644 index c6105129..00000000 --- a/src/main/java/ee/carlrobert/codegpt/completions/you/auth/SessionVerificationJob.java +++ /dev/null @@ -1,17 +0,0 @@ -package ee.carlrobert.codegpt.completions.you.auth; - -import com.intellij.openapi.diagnostic.Logger; -import java.time.LocalDateTime; -import org.quartz.Job; -import org.quartz.JobExecutionContext; - -public class SessionVerificationJob implements Job { - - private static final Logger LOG = Logger.getInstance(SessionVerificationJob.class); - - @Override - public void execute(JobExecutionContext context) { - LOG.info("Refreshing token: " + LocalDateTime.now()); - // TODO: Not implemented - } -} diff --git a/src/main/java/ee/carlrobert/codegpt/completions/you/auth/YouAuthenticationService.java b/src/main/java/ee/carlrobert/codegpt/completions/you/auth/YouAuthenticationService.java index 687d9b17..0b763260 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/you/auth/YouAuthenticationService.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/you/auth/YouAuthenticationService.java @@ -9,7 +9,7 @@ import ee.carlrobert.codegpt.completions.you.YouApiClient; import ee.carlrobert.codegpt.completions.you.YouSubscriptionNotifier; import ee.carlrobert.codegpt.completions.you.YouUserManager; import ee.carlrobert.codegpt.completions.you.auth.response.YouAuthenticationResponse; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; @@ -29,7 +29,9 @@ public final class YouAuthenticationService { return ApplicationManager.getApplication().getService(YouAuthenticationService.class); } - public void signInAsync(String email, String password, + public void signInAsync( + @NotNull String email, + @NotNull String password, AuthenticationHandler authenticationHandler) { authClient.authenticate(email, password, new AuthenticationCallback(authenticationHandler)); } @@ -44,7 +46,7 @@ public final class YouAuthenticationService { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { - OverlayUtils.showNotification("Authentication failed.", NotificationType.ERROR); + OverlayUtil.showNotification("Authentication failed.", NotificationType.ERROR); LOG.error("Unable to retrieve session", e); } diff --git a/src/main/java/ee/carlrobert/codegpt/indexes/CodebaseIndexingAction.java b/src/main/java/ee/carlrobert/codegpt/indexes/CodebaseIndexingAction.java index b13de960..16aa71b7 100644 --- a/src/main/java/ee/carlrobert/codegpt/indexes/CodebaseIndexingAction.java +++ b/src/main/java/ee/carlrobert/codegpt/indexes/CodebaseIndexingAction.java @@ -5,7 +5,7 @@ import static com.intellij.openapi.ui.DialogWrapper.OK_EXIT_CODE; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; import org.jetbrains.annotations.NotNull; public class CodebaseIndexingAction extends AnAction { @@ -19,7 +19,7 @@ public class CodebaseIndexingAction extends AnAction { var project = event.getProject(); if (project != null) { var folderStructureTreePanel = new FolderStructureTreePanel(project); - var show = OverlayUtils.showFileStructureDialog(project, folderStructureTreePanel); + var show = OverlayUtil.showFileStructureDialog(project, folderStructureTreePanel); if (show == OK_EXIT_CODE) { new CodebaseIndexingTask(project, folderStructureTreePanel.getCheckedFiles()).run(); } diff --git a/src/main/java/ee/carlrobert/codegpt/indexes/CodebaseIndexingTask.java b/src/main/java/ee/carlrobert/codegpt/indexes/CodebaseIndexingTask.java index d9d26faa..d4faf076 100644 --- a/src/main/java/ee/carlrobert/codegpt/indexes/CodebaseIndexingTask.java +++ b/src/main/java/ee/carlrobert/codegpt/indexes/CodebaseIndexingTask.java @@ -10,12 +10,11 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.io.FileUtil; import ee.carlrobert.codegpt.CodeGPTBundle; import ee.carlrobert.codegpt.CodeGPTPlugin; import ee.carlrobert.codegpt.completions.CompletionClientProvider; -import ee.carlrobert.codegpt.util.OverlayUtils; -import ee.carlrobert.codegpt.util.file.FileUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; +import ee.carlrobert.codegpt.util.file.FileUtil; import ee.carlrobert.embedding.CheckedFile; import ee.carlrobert.embedding.EmbeddingsService; import ee.carlrobert.vector.VectorStore; @@ -55,10 +54,10 @@ public class CodebaseIndexingTask extends Task.Backgroundable { throw new RuntimeException("Unable to serialize json file"); } - if (!FileUtil.exists(CodeGPTPlugin.getIndexStorePath())) { - FileUtils.tryCreateDirectory(CodeGPTPlugin.getIndexStorePath()); + if (!com.intellij.openapi.util.io.FileUtil.exists(CodeGPTPlugin.getIndexStorePath())) { + FileUtil.tryCreateDirectory(CodeGPTPlugin.getIndexStorePath()); } - FileUtils.createFile( + FileUtil.createFile( CodeGPTPlugin.getProjectIndexStorePath(project), "index.json", fileContent); try { @@ -66,7 +65,7 @@ public class CodebaseIndexingTask extends Task.Backgroundable { List> embeddings = embeddingsService.createEmbeddings(checkedFiles, indicator); VectorStore.getInstance(CodeGPTPlugin.getPluginBasePath()).save(embeddings); - OverlayUtils.showNotification("Indexing completed", NotificationType.INFORMATION); + OverlayUtil.showNotification("Indexing completed", NotificationType.INFORMATION); project.getMessageBus() .syncPublisher(CodebaseIndexingCompletedNotifier.INDEXING_COMPLETED_TOPIC) diff --git a/src/main/java/ee/carlrobert/codegpt/indexes/FolderStructureTreePanel.java b/src/main/java/ee/carlrobert/codegpt/indexes/FolderStructureTreePanel.java index 3aee0962..50c4bc31 100644 --- a/src/main/java/ee/carlrobert/codegpt/indexes/FolderStructureTreePanel.java +++ b/src/main/java/ee/carlrobert/codegpt/indexes/FolderStructureTreePanel.java @@ -19,7 +19,7 @@ import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.components.JBLabel; import com.intellij.util.ui.AsyncProcessIcon; import com.intellij.util.ui.JBUI; -import ee.carlrobert.codegpt.util.file.FileUtils; +import ee.carlrobert.codegpt.util.file.FileUtil; import ee.carlrobert.embedding.CheckedFile; import java.awt.BorderLayout; import java.awt.FlowLayout; @@ -124,7 +124,7 @@ public class FolderStructureTreePanel { panel.add(loadingFilesSpinner); } else { panel.add(new JBLabel("Total size: " - + FileUtils.convertFileSize(totalSize) + " ~ " + + FileUtil.convertFileSize(totalSize) + " ~ " + (convertLongValue(totalSize / 4)) + " tokens " + " ~ " + new DecimalFormat("#.##") .format(((double) (totalSize / 4) / 1000) * 0.0001) + " $")); @@ -153,7 +153,7 @@ public class FolderStructureTreePanel { if (node.isChecked()) { node.setChecked(!changeListManager.isIgnoredFile(file) && !ignoreManager.isPotentiallyIgnoredFile(file) - && FileUtils.isUtf8File(file.getPath()) + && FileUtil.isUtf8File(file.getPath()) && fileSize < Math.pow(1024, 2)); } @@ -212,7 +212,7 @@ public class FolderStructureTreePanel { .getFileTypeByFile((VirtualFileSystemEntry) userObject); getTextRenderer().setIcon(fileType.getIcon()); getTextRenderer().append( - " - " + FileUtils.convertFileSize( + " - " + FileUtil.convertFileSize( ((VirtualFileSystemEntry) userObject).getLength())); } } diff --git a/src/main/java/ee/carlrobert/codegpt/settings/SettingsConfigurable.java b/src/main/java/ee/carlrobert/codegpt/settings/SettingsConfigurable.java index c1b7b4e4..21e84e2f 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/SettingsConfigurable.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/SettingsConfigurable.java @@ -14,7 +14,7 @@ import ee.carlrobert.codegpt.settings.state.SettingsState; import ee.carlrobert.codegpt.settings.state.YouSettingsState; import ee.carlrobert.codegpt.telemetry.TelemetryAction; import ee.carlrobert.codegpt.toolwindow.chat.standard.StandardChatToolWindowContentManager; -import ee.carlrobert.codegpt.util.ApplicationUtils; +import ee.carlrobert.codegpt.util.ApplicationUtil; import javax.swing.JComponent; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.Nullable; @@ -53,22 +53,13 @@ public class SettingsConfigurable implements Configurable { var llamaSettings = LlamaSettingsState.getInstance(); var serviceSelectionForm = settingsComponent.getServiceSelectionForm(); - var llamaModelPreferencesForm = serviceSelectionForm.getLlamaModelPreferencesForm(); return !settingsComponent.getDisplayName().equals(settings.getDisplayName()) || isServiceChanged(settings) || openAISettings.isModified(serviceSelectionForm) || azureSettings.isModified(serviceSelectionForm) || serviceSelectionForm.isDisplayWebSearchResults() != YouSettingsState.getInstance().isDisplayWebSearchResults() - - || llamaSettings.isUseCustomModel() != llamaModelPreferencesForm.isUseCustomLlamaModel() - || llamaSettings.getServerPort() != serviceSelectionForm.getLlamaServerPort() - || llamaSettings.getContextSize() != serviceSelectionForm.getContextSize() - || llamaSettings.getThreads() != serviceSelectionForm.getThreads() - || llamaSettings.getHuggingFaceModel() != llamaModelPreferencesForm.getSelectedModel() - || !llamaSettings.getPromptTemplate().equals(llamaModelPreferencesForm.getPromptTemplate()) - || !llamaSettings.getCustomLlamaModelPath() - .equals(llamaModelPreferencesForm.getCustomLlamaModelPath()); + || llamaSettings.isModified(serviceSelectionForm); } @Override @@ -89,20 +80,11 @@ public class SettingsConfigurable implements Configurable { settings.setDisplayName(settingsComponent.getDisplayName()); settings.setSelectedService(settingsComponent.getSelectedService()); - var llamaModelPreferencesForm = serviceSelectionForm.getLlamaModelPreferencesForm(); - var llamaSettings = LlamaSettingsState.getInstance(); - llamaSettings.setCustomLlamaModelPath(llamaModelPreferencesForm.getCustomLlamaModelPath()); - llamaSettings.setHuggingFaceModel(llamaModelPreferencesForm.getSelectedModel()); - llamaSettings.setUseCustomModel(llamaModelPreferencesForm.isUseCustomLlamaModel()); - llamaSettings.setPromptTemplate(llamaModelPreferencesForm.getPromptTemplate()); - llamaSettings.setServerPort(serviceSelectionForm.getLlamaServerPort()); - llamaSettings.setContextSize(serviceSelectionForm.getContextSize()); - llamaSettings.setThreads(serviceSelectionForm.getThreads()); - var azureSettings = AzureSettingsState.getInstance(); var openAISettings = OpenAISettingsState.getInstance(); openAISettings.apply(serviceSelectionForm); azureSettings.apply(serviceSelectionForm); + LlamaSettingsState.getInstance().apply(serviceSelectionForm); YouSettingsState.getInstance() .setDisplayWebSearchResults(serviceSelectionForm.isDisplayWebSearchResults()); @@ -127,18 +109,9 @@ public class SettingsConfigurable implements Configurable { settingsComponent.setDisplayName(settings.getDisplayName()); settingsComponent.setSelectedService(settings.getSelectedService()); - var llamaSettings = LlamaSettingsState.getInstance(); - var llamaModelPreferencesForm = serviceSelectionForm.getLlamaModelPreferencesForm(); - llamaModelPreferencesForm.setSelectedModel(llamaSettings.getHuggingFaceModel()); - llamaModelPreferencesForm.setCustomLlamaModelPath(llamaSettings.getCustomLlamaModelPath()); - llamaModelPreferencesForm.setUseCustomLlamaModel(llamaSettings.isUseCustomModel()); - llamaModelPreferencesForm.setPromptTemplate(llamaSettings.getPromptTemplate()); - serviceSelectionForm.setLlamaServerPort(llamaSettings.getServerPort()); - serviceSelectionForm.setContextSize(llamaSettings.getContextSize()); - serviceSelectionForm.setThreads(llamaSettings.getThreads()); - OpenAISettingsState.getInstance().reset(serviceSelectionForm); AzureSettingsState.getInstance().reset(serviceSelectionForm); + LlamaSettingsState.getInstance().reset(serviceSelectionForm); serviceSelectionForm.setDisplayWebSearchResults( YouSettingsState.getInstance().isDisplayWebSearchResults()); @@ -158,7 +131,7 @@ public class SettingsConfigurable implements Configurable { private void resetActiveTab() { ConversationsState.getInstance().setCurrentConversation(null); - var project = ApplicationUtils.findCurrentProject(); + var project = ApplicationUtil.findCurrentProject(); if (project == null) { throw new RuntimeException("Could not find current project."); } diff --git a/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsComponent.java b/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsComponent.java index b876dde8..68f60482 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsComponent.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/advanced/AdvancedSettingsComponent.java @@ -10,7 +10,7 @@ import com.intellij.util.ui.FormBuilder; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UI; import ee.carlrobert.codegpt.CodeGPTBundle; -import ee.carlrobert.codegpt.util.SwingUtils; +import ee.carlrobert.codegpt.util.UIUtil; import java.awt.event.ItemEvent; import java.net.Proxy; import javax.swing.BoxLayout; @@ -151,20 +151,20 @@ public class AdvancedSettingsComponent { proxyPanel.setBorder(JBUI.Borders.emptyLeft(16)); proxyPanel.setLayout(new BoxLayout(proxyPanel, BoxLayout.PAGE_AXIS)); - var proxyTypePanel = SwingUtils.createPanel( + var proxyTypePanel = UIUtil.createPanel( proxyTypeComboBox, CodeGPTBundle.get("advancedSettingsConfigurable.proxy.typeComboBoxField.label"), false); - var proxyHostPanel = SwingUtils.createPanel( + var proxyHostPanel = UIUtil.createPanel( proxyHostField, CodeGPTBundle.get("advancedSettingsConfigurable.proxy.hostField.label"), false); - var proxyPortPanel = SwingUtils.createPanel( + var proxyPortPanel = UIUtil.createPanel( proxyPortField, CodeGPTBundle.get("advancedSettingsConfigurable.proxy.portField.label"), false); - SwingUtils.setEqualLabelWidths(proxyTypePanel, proxyHostPanel); - SwingUtils.setEqualLabelWidths(proxyPortPanel, proxyHostPanel); + UIUtil.setEqualLabelWidths(proxyTypePanel, proxyHostPanel); + UIUtil.setEqualLabelWidths(proxyPortPanel, proxyHostPanel); proxyPanel.add(proxyTypePanel); proxyPanel.add(proxyHostPanel); @@ -173,13 +173,13 @@ public class AdvancedSettingsComponent { .panel(proxyAuthCheckbox) .createPanel()); - var proxyUsernamePanel = SwingUtils.createPanel(proxyAuthUsername, + var proxyUsernamePanel = UIUtil.createPanel(proxyAuthUsername, CodeGPTBundle.get("advancedSettingsConfigurable.proxy.usernameField.label"), false); - var proxyPasswordPanel = SwingUtils.createPanel(proxyAuthPassword, + var proxyPasswordPanel = UIUtil.createPanel(proxyAuthPassword, CodeGPTBundle.get("advancedSettingsConfigurable.proxy.passwordField.label"), false); - SwingUtils.setEqualLabelWidths(proxyPasswordPanel, proxyUsernamePanel); + UIUtil.setEqualLabelWidths(proxyPasswordPanel, proxyUsernamePanel); var proxyAuthPanel = FormBuilder.createFormBuilder() .addVerticalGap(4) 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 d4564ab4..23bbe2e1 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationComponent.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationComponent.java @@ -23,7 +23,7 @@ import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UI; import ee.carlrobert.codegpt.CodeGPTBundle; import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil; -import ee.carlrobert.codegpt.util.SwingUtils; +import ee.carlrobert.codegpt.util.UIUtil; import java.awt.Dimension; import java.util.Arrays; import java.util.LinkedHashMap; @@ -103,7 +103,7 @@ public class ConfigurationComponent { configuration.isCreateNewChatOnEachAction()); methodNameGenerationCheckBox = new JBCheckBox( CodeGPTBundle.get("configurationConfigurable.enableMethodNameGeneration.label"), - configuration.isMethodNameGenerationEnabled()); + configuration.isMethodRefactoringEnabled()); mainPanel = FormBuilder.createFormBuilder() .addComponent(tablePanel) @@ -157,7 +157,7 @@ public class ConfigurationComponent { UI.PanelFactory.panel(component) .resizeX(false) .withComment(CodeGPTBundle.get(commentKey)) - .withCommentHyperlinkListener(SwingUtils::handleHyperlinkClicked) + .withCommentHyperlinkListener(UIUtil::handleHyperlinkClicked) .createPanel(), true ); 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 9f61bdf6..301f2d9b 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationConfigurable.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationConfigurable.java @@ -40,7 +40,7 @@ public class ConfigurationConfigurable implements Configurable { || configurationComponent.isCreateNewChatOnEachAction() != configuration.isCreateNewChatOnEachAction() || configurationComponent.isMethodNameGenerationEnabled() - != configuration.isMethodNameGenerationEnabled(); + != configuration.isMethodRefactoringEnabled(); } @Override @@ -67,7 +67,7 @@ public class ConfigurationConfigurable implements Configurable { configurationComponent.setCreateNewChatOnEachAction( configuration.isCreateNewChatOnEachAction()); configurationComponent.setDisableMethodNameGeneration( - configuration.isMethodNameGenerationEnabled()); + configuration.isMethodRefactoringEnabled()); EditorActionsUtil.refreshActions(); } 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 1a5bb1b9..7a36675b 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationState.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationState.java @@ -88,7 +88,7 @@ public class ConfigurationState implements PersistentStateComponent - onUpdateProgress.accept(DownloadingUtils.getFormattedDownloadProgress( + onUpdateProgress.accept(DownloadingUtil.getFormattedDownloadProgress( startTime, fileSize, bytesRead[0])), 0, 1, TimeUnit.SECONDS); - FileUtils.copyFileWithProgress(model.getFileName(), url, bytesRead, fileSize, indicator); + FileUtil.copyFileWithProgress(model.getFileName(), url, bytesRead, fileSize, indicator); } catch (IOException ex) { LOG.error("Unable to open connection", ex); onFailed.accept(ex); diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaModelPreferencesForm.java b/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaModelPreferencesForm.java index 344bbdf1..72f7c34e 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaModelPreferencesForm.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaModelPreferencesForm.java @@ -264,6 +264,12 @@ public class LlamaModelPreferencesForm { return promptTemplateComboBox.getItem(); } + public String getActualModelPath() { + return isUseCustomLlamaModel() + ? getCustomLlamaModelPath() + : CodeGPTPlugin.getLlamaModelsPath() + File.separator + getSelectedModel().getFileName(); + } + private ComboBox createModelComboBox( EnumComboBoxModel llamaModelEnumComboBoxModel, LlamaModel llamaModel, diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaServiceSelectionForm.java b/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaServiceSelectionForm.java index 1ff89001..80779105 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaServiceSelectionForm.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaServiceSelectionForm.java @@ -16,7 +16,7 @@ import ee.carlrobert.codegpt.CodeGPTPlugin; import ee.carlrobert.codegpt.completions.HuggingFaceModel; import ee.carlrobert.codegpt.completions.llama.LlamaServerAgent; import ee.carlrobert.codegpt.settings.state.LlamaSettingsState; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; import java.awt.BorderLayout; import java.io.File; import javax.swing.JButton; @@ -51,14 +51,14 @@ public class LlamaServiceSelectionForm extends JPanel { threadsField.setEnabled(!serverRunning); var serverProgressPanel = new ServerProgressPanel(); - var serverButton = getServerButton(serverRunning, llamaServerAgent, serverProgressPanel); + var serverButton = getServerButton(llamaServerAgent, serverProgressPanel); var contextSizeHelpText = ComponentPanelBuilder.createCommentComponent( CodeGPTBundle.get("settingsConfigurable.service.llama.contextSize.comment"), true); contextSizeHelpText.setBorder(JBUI.Borders.empty(0, 4)); var threadsHelpText = ComponentPanelBuilder.createCommentComponent( - CodeGPTBundle.get("settingsConfigurable.service.llama.threads.comment"), - true); + CodeGPTBundle.get("settingsConfigurable.service.llama.threads.comment"), + true); setLayout(new BorderLayout()); add(FormBuilder.createFormBuilder() @@ -121,72 +121,83 @@ public class LlamaServiceSelectionForm extends JPanel { return threadsField.getValue(); } - private JButton getServerButton(boolean serverRunning, LlamaServerAgent llamaServerAgent, + private JButton getServerButton( + LlamaServerAgent llamaServerAgent, ServerProgressPanel serverProgressPanel) { + var serverRunning = llamaServerAgent.isServerRunning(); var serverButton = new JButton(); serverButton.setText(serverRunning ? CodeGPTBundle.get("settingsConfigurable.service.llama.stopServer.label") : CodeGPTBundle.get("settingsConfigurable.service.llama.startServer.label")); serverButton.setIcon(serverRunning ? Actions.Suspend : Actions.Execute); serverButton.addActionListener(event -> { - if (llamaModelPreferencesForm.isUseCustomLlamaModel()) { - var customModelPath = llamaModelPreferencesForm.getCustomLlamaModelPath(); - if (customModelPath == null || customModelPath.isEmpty()) { - OverlayUtils.showBalloon( - CodeGPTBundle.get("validation.error.fieldRequired"), - MessageType.ERROR, - llamaModelPreferencesForm.getCustomModelPathBrowserButton()); - return; - } - } else { - if (!isModelExists(llamaModelPreferencesForm.getSelectedModel())) { - OverlayUtils.showBalloon( - CodeGPTBundle.get( - "settingsConfigurable.service.llama.overlay.modelNotDownloaded.text"), - MessageType.ERROR, - llamaModelPreferencesForm.getHuggingFaceModelComboBox()); - return; - } + if (!validateModelConfiguration()) { + return; } if (llamaServerAgent.isServerRunning()) { - setFormEnabled(true); - serverButton.setText( - CodeGPTBundle.get("settingsConfigurable.service.llama.startServer.label")); - serverButton.setIcon(Actions.Execute); - serverProgressPanel.updateText( - CodeGPTBundle.get("settingsConfigurable.service.llama.progress.stoppingServer")); + enableForm(serverButton, serverProgressPanel); llamaServerAgent.stopAgent(); } else { - setFormEnabled(false); - serverButton.setText( - CodeGPTBundle.get("settingsConfigurable.service.llama.stopServer.label")); - serverButton.setIcon(Actions.Suspend); - serverProgressPanel.startProgress( - CodeGPTBundle.get("settingsConfigurable.service.llama.progress.startingServer")); - - // TODO: Move to LlamaModelPreferencesForm - var modelPath = llamaModelPreferencesForm.isUseCustomLlamaModel() - ? llamaModelPreferencesForm.getCustomLlamaModelPath() - : CodeGPTPlugin.getLlamaModelsPath() - + File.separator - + llamaModelPreferencesForm.getSelectedModel().getFileName(); - llamaServerAgent.startAgent( - modelPath, - maxTokensField.getValue(), - threadsField.getValue(), - portField.getNumber(), - serverProgressPanel, - () -> { - setFormEnabled(false); - serverProgressPanel.displayComponent( - new JBLabel("Server running", Actions.Checked, SwingConstants.LEADING)); - }); + disableForm(serverButton, serverProgressPanel); + llamaServerAgent.startAgent(this, serverProgressPanel, () -> { + setFormEnabled(false); + serverProgressPanel.displayComponent( + new JBLabel("Server running", Actions.Checked, SwingConstants.LEADING)); + }); } }); return serverButton; } + private boolean validateModelConfiguration() { + return validateCustomModelPath() && validateSelectedModel(); + } + + private boolean validateCustomModelPath() { + if (llamaModelPreferencesForm.isUseCustomLlamaModel()) { + var customModelPath = llamaModelPreferencesForm.getCustomLlamaModelPath(); + if (customModelPath == null || customModelPath.isEmpty()) { + OverlayUtil.showBalloon( + CodeGPTBundle.get("validation.error.fieldRequired"), + MessageType.ERROR, + llamaModelPreferencesForm.getCustomModelPathBrowserButton()); + return false; + } + } + return true; + } + + private boolean validateSelectedModel() { + if (!llamaModelPreferencesForm.isUseCustomLlamaModel() && !isModelExists( + llamaModelPreferencesForm.getSelectedModel())) { + OverlayUtil.showBalloon( + CodeGPTBundle.get("settingsConfigurable.service.llama.overlay.modelNotDownloaded.text"), + MessageType.ERROR, + llamaModelPreferencesForm.getHuggingFaceModelComboBox()); + return false; + } + return true; + } + + private void enableForm(JButton serverButton, ServerProgressPanel progressPanel) { + setFormEnabled(true); + serverButton.setText( + CodeGPTBundle.get("settingsConfigurable.service.llama.startServer.label")); + serverButton.setIcon(Actions.Execute); + progressPanel.updateText( + CodeGPTBundle.get("settingsConfigurable.service.llama.progress.stoppingServer")); + } + + private void disableForm(JButton serverButton, ServerProgressPanel progressPanel) { + setFormEnabled(false); + serverButton.setText( + CodeGPTBundle.get("settingsConfigurable.service.llama.stopServer.label")); + serverButton.setIcon(Actions.Suspend); + progressPanel.startProgress( + CodeGPTBundle.get("settingsConfigurable.service.llama.progress.startingServer")); + } + private boolean isModelExists(HuggingFaceModel model) { return FileUtil.exists( CodeGPTPlugin.getLlamaModelsPath() + File.separator + model.getFileName()); diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/ServiceSelectionForm.java b/src/main/java/ee/carlrobert/codegpt/settings/service/ServiceSelectionForm.java index 47787301..e3e5ccb7 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/ServiceSelectionForm.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/ServiceSelectionForm.java @@ -20,7 +20,7 @@ import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager; import ee.carlrobert.codegpt.settings.state.AzureSettingsState; import ee.carlrobert.codegpt.settings.state.OpenAISettingsState; import ee.carlrobert.codegpt.settings.state.YouSettingsState; -import ee.carlrobert.codegpt.util.SwingUtils; +import ee.carlrobert.codegpt.util.UIUtil; import ee.carlrobert.llm.client.openai.completion.chat.OpenAIChatCompletionModel; import java.util.List; import java.util.Map; @@ -151,7 +151,7 @@ public class ServiceSelectionForm { .resizeX(false) .withComment( CodeGPTBundle.get("settingsConfigurable.service.openai.apiKey.comment")) - .withCommentHyperlinkListener(SwingUtils::handleHyperlinkClicked) + .withCommentHyperlinkListener(UIUtil::handleHyperlinkClicked) .createPanel(); return FormBuilder.createFormBuilder() diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/YouServiceSelectionForm.java b/src/main/java/ee/carlrobert/codegpt/settings/service/YouServiceSelectionForm.java index 51d4087a..8944d64c 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/YouServiceSelectionForm.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/YouServiceSelectionForm.java @@ -22,7 +22,7 @@ import ee.carlrobert.codegpt.completions.you.auth.response.YouAuthenticationResp import ee.carlrobert.codegpt.completions.you.auth.response.YouUser; import ee.carlrobert.codegpt.credentials.YouCredentialsManager; import ee.carlrobert.codegpt.settings.state.SettingsState; -import ee.carlrobert.codegpt.util.SwingUtils; +import ee.carlrobert.codegpt.util.UIUtil; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.util.regex.Pattern; @@ -134,7 +134,7 @@ public class YouServiceSelectionForm extends JPanel { } private JTextPane createSignUpTextPane() { - var textPane = SwingUtils.createTextPane( + var textPane = UIUtil.createTextPane( "Don't have an account? Sign up"); textPane.setBorder(JBUI.Borders.emptyLeft(4)); textPane.setOpaque(false); diff --git a/src/main/java/ee/carlrobert/codegpt/settings/state/LlamaSettingsState.java b/src/main/java/ee/carlrobert/codegpt/settings/state/LlamaSettingsState.java index 43bcae7f..51e0d27c 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/state/LlamaSettingsState.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/state/LlamaSettingsState.java @@ -7,6 +7,7 @@ import com.intellij.openapi.components.Storage; import com.intellij.util.xmlb.XmlSerializerUtil; import ee.carlrobert.codegpt.completions.HuggingFaceModel; import ee.carlrobert.codegpt.completions.llama.PromptTemplate; +import ee.carlrobert.codegpt.settings.service.ServiceSelectionForm; import java.io.IOException; import java.net.ServerSocket; import org.jetbrains.annotations.NotNull; @@ -40,6 +41,39 @@ public class LlamaSettingsState implements PersistentStateComponent\n" + "\n" + "

Use CodeGPT coupon for free month of GPT-4.

\n" diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ResponseNodeRenderer.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ResponseNodeRenderer.java index b747dde0..21930696 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ResponseNodeRenderer.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ResponseNodeRenderer.java @@ -1,5 +1,6 @@ package ee.carlrobert.codegpt.toolwindow.chat; +import com.intellij.ui.ColorUtil; import com.intellij.ui.JBColor; import com.vladsch.flexmark.ast.BulletListItem; import com.vladsch.flexmark.ast.Code; @@ -11,7 +12,6 @@ import com.vladsch.flexmark.html.renderer.NodeRendererContext; import com.vladsch.flexmark.html.renderer.NodeRendererFactory; import com.vladsch.flexmark.html.renderer.NodeRenderingHandler; import com.vladsch.flexmark.util.data.DataHolder; -import ee.carlrobert.codegpt.util.ThemeUtils; import java.util.Set; import org.jetbrains.annotations.NotNull; @@ -26,7 +26,7 @@ public class ResponseNodeRenderer implements NodeRenderer { } private void renderCode(Code node, NodeRendererContext context, HtmlWriter html) { - html.attr("style", "color: " + ThemeUtils.getRGB(new JBColor(0x00627A, 0xCC7832))); + html.attr("style", "color: " + ColorUtil.toHex(new JBColor(0x00627A, 0xCC7832))); context.delegateRender(); } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ToolWindowCompletionResponseEventListener.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ToolWindowCompletionResponseEventListener.java index 874230d9..8c3cef5c 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ToolWindowCompletionResponseEventListener.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ToolWindowCompletionResponseEventListener.java @@ -18,7 +18,7 @@ import ee.carlrobert.codegpt.toolwindow.chat.components.ChatMessageResponseBody; import ee.carlrobert.codegpt.toolwindow.chat.components.ResponsePanel; import ee.carlrobert.codegpt.toolwindow.chat.components.TotalTokensPanel; import ee.carlrobert.codegpt.toolwindow.chat.components.UserPromptTextArea; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; import ee.carlrobert.llm.client.openai.completion.ErrorDetails; import ee.carlrobert.llm.client.you.completion.YouSerpResult; import java.util.HashMap; @@ -98,7 +98,7 @@ abstract class ToolWindowCompletionResponseEventListener implements @Override public void handleTokensExceeded(Conversation conversation, Message message) { - var answer = OverlayUtils.showTokenLimitExceededDialog(); + var answer = OverlayUtil.showTokenLimitExceededDialog(); if (answer == OK) { TelemetryAction.IDE_ACTION.createActionMessage() .property("action", "DISCARD_TOKEN_LIMIT") diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/YouModelChangeNotifier.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/YouModelChangeNotifier.java deleted file mode 100644 index 5bddfcef..00000000 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/YouModelChangeNotifier.java +++ /dev/null @@ -1,11 +0,0 @@ -package ee.carlrobert.codegpt.toolwindow.chat; - -import com.intellij.util.messages.Topic; - -public interface YouModelChangeNotifier { - - Topic YOU_MODEL_CHANGE_NOTIFIER_TOPIC = - Topic.create("youModelChangeTopic", YouModelChangeNotifier.class); - - void modelChanged(boolean selected); -} diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/ChatMessageResponseBody.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/ChatMessageResponseBody.java index 0759d395..3b2d17b7 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/ChatMessageResponseBody.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/ChatMessageResponseBody.java @@ -1,6 +1,6 @@ package ee.carlrobert.codegpt.toolwindow.chat.components; -import static ee.carlrobert.codegpt.util.ThemeUtils.getPanelBackgroundColor; +import static ee.carlrobert.codegpt.util.UIUtil.getPanelBackgroundColor; import static java.lang.String.format; import static javax.swing.event.HyperlinkEvent.EventType.ACTIVATED; @@ -26,8 +26,8 @@ import ee.carlrobert.codegpt.toolwindow.chat.ResponseNodeRenderer; import ee.carlrobert.codegpt.toolwindow.chat.StreamParser; import ee.carlrobert.codegpt.toolwindow.chat.StreamResponseType; import ee.carlrobert.codegpt.toolwindow.chat.editor.ResponseEditor; -import ee.carlrobert.codegpt.util.MarkdownUtils; -import ee.carlrobert.codegpt.util.SwingUtils; +import ee.carlrobert.codegpt.util.MarkdownUtil; +import ee.carlrobert.codegpt.util.UIUtil; import ee.carlrobert.llm.client.you.completion.YouSerpResult; import java.awt.BorderLayout; import java.awt.Color; @@ -93,7 +93,7 @@ public class ChatMessageResponseBody extends JPanel { } public ChatMessageResponseBody withResponse(String response) { - for (var message : MarkdownUtils.splitCodeBlocks(response)) { + for (var message : MarkdownUtil.splitCodeBlocks(response)) { boolean isCodeResponse = message.startsWith("```"); if (isCodeResponse) { currentlyProcessedEditor = null; @@ -281,14 +281,14 @@ public class ChatMessageResponseBody extends JPanel { } private JTextPane createTextPane(String text) { - var textPane = SwingUtils.createTextPane(text, event -> { + var textPane = UIUtil.createTextPane(text, event -> { if (FileUtil.exists(event.getDescription()) && ACTIVATED.equals(event.getEventType())) { VirtualFile file = LocalFileSystem.getInstance().findFileByPath(event.getDescription()); FileEditorManager.getInstance(project).openFile(Objects.requireNonNull(file), true); return; } - SwingUtils.handleHyperlinkClicked(event); + UIUtil.handleHyperlinkClicked(event); }); textPane.getCaret().setVisible(true); textPane.setCaretPosition(textPane.getDocument().getLength()); diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/ResponsePanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/ResponsePanel.java index fbfc4a19..853b0cdc 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/ResponsePanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/ResponsePanel.java @@ -1,6 +1,6 @@ package ee.carlrobert.codegpt.toolwindow.chat.components; -import static ee.carlrobert.codegpt.util.ThemeUtils.getPanelBackgroundColor; +import static ee.carlrobert.codegpt.util.UIUtil.getPanelBackgroundColor; import com.intellij.icons.AllIcons.Actions; import com.intellij.openapi.actionSystem.AnAction; diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/UserPromptTextArea.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/UserPromptTextArea.java index 46dbb0ed..d3d442fe 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/UserPromptTextArea.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/UserPromptTextArea.java @@ -8,11 +8,10 @@ import com.intellij.ui.DocumentAdapter; import com.intellij.ui.JBColor; import com.intellij.ui.components.JBTextArea; import com.intellij.util.ui.JBUI; -import com.intellij.util.ui.UIUtil; import ee.carlrobert.codegpt.CodeGPTBundle; import ee.carlrobert.codegpt.Icons; import ee.carlrobert.codegpt.completions.CompletionRequestHandler; -import ee.carlrobert.codegpt.util.SwingUtils; +import ee.carlrobert.codegpt.util.UIUtil; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Cursor; @@ -29,7 +28,6 @@ import javax.swing.AbstractAction; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JPanel; -import javax.swing.KeyStroke; import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.text.BadLocationException; @@ -40,10 +38,8 @@ public class UserPromptTextArea extends JPanel { private static final Logger LOG = Logger.getInstance(UserPromptTextArea.class); - private static final String TEXT_SUBMIT = "text-submit"; - private static final String INSERT_BREAK = "insert-break"; private static final JBColor BACKGROUND_COLOR = JBColor.namedColor( - "Editor.SearchField.background", UIUtil.getTextFieldBackground()); + "Editor.SearchField.background", com.intellij.util.ui.UIUtil.getTextFieldBackground()); private final JBTextArea textArea; @@ -64,10 +60,7 @@ public class UserPromptTextArea extends JPanel { textArea.setWrapStyleWord(true); textArea.getEmptyText().setText(CodeGPTBundle.get("toolwindow.chat.textArea.emptyText")); textArea.setBorder(JBUI.Borders.empty(8, 4)); - var input = textArea.getInputMap(); - input.put(KeyStroke.getKeyStroke("ENTER"), TEXT_SUBMIT); - input.put(KeyStroke.getKeyStroke("shift ENTER"), INSERT_BREAK); - textArea.getActionMap().put(TEXT_SUBMIT, new AbstractAction() { + UIUtil.addShiftEnterInputMap(textArea, new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { try { @@ -190,7 +183,7 @@ public class UserPromptTextArea extends JPanel { // TODO: IconActionButton? private JButton createIconButton(Icon icon, @Nullable Runnable submitListener) { - var button = SwingUtils.createIconButton(icon); + var button = UIUtil.createIconButton(icon); if (submitListener != null) { button.addActionListener((e) -> handleSubmit()); } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/UserPromptTextAreaHeader.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/UserPromptTextAreaHeader.java index 79a5aebe..2f713d6b 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/UserPromptTextAreaHeader.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/UserPromptTextAreaHeader.java @@ -1,9 +1,8 @@ package ee.carlrobert.codegpt.toolwindow.chat.components; -import static ee.carlrobert.codegpt.util.ThemeUtils.getPanelBackgroundColor; +import static ee.carlrobert.codegpt.util.UIUtil.getPanelBackgroundColor; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; import com.intellij.ui.components.JBCheckBox; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.JBUI; @@ -12,16 +11,12 @@ import ee.carlrobert.codegpt.completions.you.YouSubscriptionNotifier; import ee.carlrobert.codegpt.completions.you.auth.SignedOutNotifier; import ee.carlrobert.codegpt.settings.state.SettingsState; import ee.carlrobert.codegpt.toolwindow.ModelIconLabel; -import ee.carlrobert.codegpt.toolwindow.chat.YouModelChangeNotifier; import java.awt.BorderLayout; import javax.swing.JPanel; public class UserPromptTextAreaHeader extends JPanel { - public UserPromptTextAreaHeader( - Project project, - SettingsState settings, - TotalTokensPanel totalTokensPanel) { + public UserPromptTextAreaHeader(SettingsState settings, TotalTokensPanel totalTokensPanel) { super(new BorderLayout()); setBackground(getPanelBackgroundColor()); setBorder(JBUI.Borders.emptyBottom(8)); @@ -31,8 +26,8 @@ public class UserPromptTextAreaHeader extends JPanel { add(totalTokensPanel, BorderLayout.LINE_START); break; case YOU: - JBCheckBox gpt4CheckBox = new YouProCheckbox(project); - subscribeToYouTopics(project, gpt4CheckBox); + JBCheckBox gpt4CheckBox = new YouProCheckbox(); + subscribeToYouTopics(gpt4CheckBox); add(gpt4CheckBox, BorderLayout.LINE_START); break; default: @@ -45,21 +40,12 @@ public class UserPromptTextAreaHeader extends JPanel { .withBackground(getPanelBackgroundColor()), BorderLayout.LINE_END); } - private void subscribeToYouTopics(Project project, JBCheckBox gpt4CheckBox) { + private void subscribeToYouTopics(JBCheckBox gpt4CheckBox) { var messageBusConnection = ApplicationManager.getApplication().getMessageBus().connect(); - subscribeToYouModelChangeTopic(project, gpt4CheckBox); subscribeToYouSubscriptionTopic(messageBusConnection, gpt4CheckBox); subscribeToSignedOutTopic(messageBusConnection, gpt4CheckBox); } - private void subscribeToYouModelChangeTopic(Project project, JBCheckBox gpt4CheckBox) { - project.getMessageBus() - .connect() - .subscribe( - YouModelChangeNotifier.YOU_MODEL_CHANGE_NOTIFIER_TOPIC, - (YouModelChangeNotifier) gpt4CheckBox::setSelected); - } - private void subscribeToSignedOutTopic( MessageBusConnection messageBusConnection, JBCheckBox gpt4CheckBox) { diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/YouProCheckbox.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/YouProCheckbox.java index a0f87d32..06b5ed58 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/YouProCheckbox.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/components/YouProCheckbox.java @@ -1,16 +1,13 @@ package ee.carlrobert.codegpt.toolwindow.chat.components; -import com.intellij.openapi.project.Project; import com.intellij.ui.components.JBCheckBox; import ee.carlrobert.codegpt.CodeGPTBundle; import ee.carlrobert.codegpt.completions.you.YouUserManager; import ee.carlrobert.codegpt.settings.state.YouSettingsState; -import ee.carlrobert.codegpt.toolwindow.chat.YouModelChangeNotifier; -import org.jetbrains.annotations.NotNull; public class YouProCheckbox extends JBCheckBox { - public YouProCheckbox(@NotNull Project project) { + public YouProCheckbox() { super(CodeGPTBundle.get("toolwindow.chat.youProCheckBox.text")); var youSettings = YouSettingsState.getInstance(); var youUserManager = YouUserManager.getInstance(); @@ -21,10 +18,6 @@ public class YouProCheckbox extends JBCheckBox { addChangeListener(e -> { var selected = ((JBCheckBox) e.getSource()).isSelected(); setToolTipText(getTooltipText(youUserManager, selected)); - // TODO: Remove - project.getMessageBus() - .syncPublisher(YouModelChangeNotifier.YOU_MODEL_CHANGE_NOTIFIER_TOPIC) - .modelChanged(selected); youSettings.setUseGPT4Model(selected); }); } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/contextual/ContextualChatToolWindowLandingPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/contextual/ContextualChatToolWindowLandingPanel.java index 806c6c38..6f201832 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/contextual/ContextualChatToolWindowLandingPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/contextual/ContextualChatToolWindowLandingPanel.java @@ -1,7 +1,7 @@ package ee.carlrobert.codegpt.toolwindow.chat.contextual; import static com.intellij.openapi.ui.DialogWrapper.OK_EXIT_CODE; -import static ee.carlrobert.codegpt.util.ThemeUtils.getPanelBackgroundColor; +import static ee.carlrobert.codegpt.util.UIUtil.getPanelBackgroundColor; import static javax.swing.event.HyperlinkEvent.EventType.ACTIVATED; import com.intellij.openapi.diagnostic.Logger; @@ -13,8 +13,8 @@ import ee.carlrobert.codegpt.indexes.CodebaseIndexingTask; import ee.carlrobert.codegpt.indexes.FolderStructureTreePanel; import ee.carlrobert.codegpt.settings.SettingsConfigurable; import ee.carlrobert.codegpt.toolwindow.chat.components.ResponsePanel; -import ee.carlrobert.codegpt.util.OverlayUtils; -import ee.carlrobert.codegpt.util.SwingUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; +import ee.carlrobert.codegpt.util.UIUtil; import ee.carlrobert.vector.VectorStore; import javax.swing.JTextPane; import javax.swing.event.HyperlinkEvent; @@ -77,7 +77,7 @@ class ContextualChatToolWindowLandingPanel extends ResponsePanel { } private JTextPane createTextPane() { - var textPane = SwingUtils.createTextPane("", this::handleHyperlinkClicked); + var textPane = UIUtil.createTextPane("", this::handleHyperlinkClicked); textPane.setBackground(getPanelBackgroundColor()); return textPane; } @@ -102,7 +102,7 @@ class ContextualChatToolWindowLandingPanel extends ResponsePanel { break; case "START_INDEXING": var folderStructureTreePanel = new FolderStructureTreePanel(project); - var show = OverlayUtils.showFileStructureDialog(project, folderStructureTreePanel); + var show = OverlayUtil.showFileStructureDialog(project, folderStructureTreePanel); if (show == OK_EXIT_CODE) { new CodebaseIndexingTask(project, folderStructureTreePanel.getCheckedFiles()).run(); } @@ -111,7 +111,7 @@ class ContextualChatToolWindowLandingPanel extends ResponsePanel { LOG.error("Could not trigger action {}", event.getDescription()); } } else { - SwingUtils.handleHyperlinkClicked(event); + UIUtil.handleHyperlinkClicked(event); } } } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/ResponseEditor.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/ResponseEditor.java index 22ed7182..f932d764 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/ResponseEditor.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/ResponseEditor.java @@ -1,6 +1,6 @@ package ee.carlrobert.codegpt.toolwindow.chat.editor; -import static ee.carlrobert.codegpt.util.file.FileUtils.findLanguageExtensionMapping; +import static ee.carlrobert.codegpt.util.file.FileUtil.findLanguageExtensionMapping; import static java.lang.String.format; import com.intellij.icons.AllIcons.General; @@ -28,7 +28,7 @@ import ee.carlrobert.codegpt.toolwindow.chat.editor.actions.DiffAction; import ee.carlrobert.codegpt.toolwindow.chat.editor.actions.EditAction; import ee.carlrobert.codegpt.toolwindow.chat.editor.actions.NewFileAction; import ee.carlrobert.codegpt.toolwindow.chat.editor.actions.ReplaceSelectionAction; -import ee.carlrobert.codegpt.util.EditorUtils; +import ee.carlrobert.codegpt.util.EditorUtil; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; @@ -53,7 +53,7 @@ public class ResponseEditor extends JPanel implements Disposable { var extensionMapping = findLanguageExtensionMapping(markdownLanguage); language = extensionMapping.getKey(); extension = extensionMapping.getValue(); - editor = EditorUtils.createEditor(project, extension, code); + editor = EditorUtil.createEditor(project, extension, code); DefaultActionGroup group = new DefaultActionGroup(); group.add(new ReplaceCodeInMainEditorAction()); diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/CopyAction.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/CopyAction.java index 1578c83e..25334e6e 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/CopyAction.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/CopyAction.java @@ -6,7 +6,7 @@ import com.intellij.openapi.editor.Editor; import ee.carlrobert.codegpt.CodeGPTBundle; import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.TrackableAction; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.OverlayUtil; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; @@ -33,7 +33,7 @@ public class CopyAction extends TrackableAction { var locationOnScreen = ((MouseEvent) event.getInputEvent()).getLocationOnScreen(); locationOnScreen.y = locationOnScreen.y - 16; - OverlayUtils.showInfoBalloon( + OverlayUtil.showInfoBalloon( CodeGPTBundle.get("toolwindow.chat.editor.action.copy.success"), locationOnScreen); } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/DiffAction.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/DiffAction.java index 18f5e51b..f081cefb 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/DiffAction.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/DiffAction.java @@ -17,9 +17,9 @@ import com.intellij.openapi.util.Pair; import ee.carlrobert.codegpt.CodeGPTBundle; import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.TrackableAction; -import ee.carlrobert.codegpt.util.EditorUtils; -import ee.carlrobert.codegpt.util.OverlayUtils; -import ee.carlrobert.codegpt.util.file.FileUtils; +import ee.carlrobert.codegpt.util.EditorUtil; +import ee.carlrobert.codegpt.util.OverlayUtil; +import ee.carlrobert.codegpt.util.file.FileUtil; import org.jetbrains.annotations.NotNull; public class DiffAction extends TrackableAction { @@ -37,16 +37,16 @@ public class DiffAction extends TrackableAction { public void handleAction(@NotNull AnActionEvent event) { var project = requireNonNull(event.getProject()); var selectedTextEditor = FileEditorManager.getInstance(project).getSelectedTextEditor(); - if (!EditorUtils.hasSelection(selectedTextEditor)) { - OverlayUtils.showSelectedEditorSelectionWarning(event); + if (!EditorUtil.hasSelection(selectedTextEditor)) { + OverlayUtil.showSelectedEditorSelectionWarning(event); return; } - var resultEditorFile = FileUtils.getEditorFile(selectedTextEditor); + var resultEditorFile = FileUtil.getEditorFile(selectedTextEditor); var diffContentFactory = DiffContentFactory.getInstance(); var request = new SimpleDiffRequest( CodeGPTBundle.get("editor.diff.title"), - diffContentFactory.create(project, FileUtils.getEditorFile(editor)), + diffContentFactory.create(project, FileUtil.getEditorFile(editor)), diffContentFactory.create(project, resultEditorFile), CodeGPTBundle.get("editor.diff.local.content.title"), resultEditorFile.getName()); diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/NewFileAction.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/NewFileAction.java index dcc8544f..f2eeefbe 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/NewFileAction.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/NewFileAction.java @@ -18,7 +18,7 @@ import com.intellij.util.ui.FormBuilder; import ee.carlrobert.codegpt.CodeGPTBundle; import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.TrackableAction; -import ee.carlrobert.codegpt.util.file.FileUtils; +import ee.carlrobert.codegpt.util.file.FileUtil; import java.util.Objects; import org.jetbrains.annotations.NotNull; @@ -49,7 +49,7 @@ public class NewFileAction extends TrackableAction { fileNameTextField.setColumns(30); if (showDialog(project, textFieldWithBrowseButton, fileNameTextField) == OK_EXIT_CODE) { - var file = FileUtils.createFile( + var file = FileUtil.createFile( textFieldWithBrowseButton.getText(), fileNameTextField.getText(), editor.getDocument().getText()); diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/ReplaceSelectionAction.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/ReplaceSelectionAction.java index 7e74d522..cefd5c1c 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/ReplaceSelectionAction.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/ReplaceSelectionAction.java @@ -8,8 +8,8 @@ import com.intellij.openapi.editor.Editor; import ee.carlrobert.codegpt.CodeGPTBundle; import ee.carlrobert.codegpt.actions.ActionType; import ee.carlrobert.codegpt.actions.TrackableAction; -import ee.carlrobert.codegpt.util.EditorUtils; -import ee.carlrobert.codegpt.util.OverlayUtils; +import ee.carlrobert.codegpt.util.EditorUtil; +import ee.carlrobert.codegpt.util.OverlayUtil; import org.jetbrains.annotations.NotNull; public class ReplaceSelectionAction extends TrackableAction { @@ -26,10 +26,10 @@ public class ReplaceSelectionAction extends TrackableAction { @Override public void handleAction(@NotNull AnActionEvent event) { var project = requireNonNull(event.getProject()); - if (EditorUtils.isMainEditorTextSelected(project)) { - EditorUtils.replaceMainEditorSelection(project, editor.getDocument().getText()); + if (EditorUtil.isMainEditorTextSelected(project)) { + EditorUtil.replaceMainEditorSelection(project, editor.getDocument().getText()); } else { - OverlayUtils.showSelectedEditorSelectionWarning(event); + OverlayUtil.showSelectedEditorSelectionWarning(event); } } } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/standard/StandardChatToolWindowLandingPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/standard/StandardChatToolWindowLandingPanel.java index 1706f1a9..ff2f60b5 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/standard/StandardChatToolWindowLandingPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/standard/StandardChatToolWindowLandingPanel.java @@ -1,13 +1,13 @@ package ee.carlrobert.codegpt.toolwindow.chat.standard; -import static ee.carlrobert.codegpt.util.ThemeUtils.getPanelBackgroundColor; +import static ee.carlrobert.codegpt.util.UIUtil.getPanelBackgroundColor; import static java.lang.String.format; import static javax.swing.event.HyperlinkEvent.EventType.ACTIVATED; import com.intellij.openapi.diagnostic.Logger; import ee.carlrobert.codegpt.settings.state.SettingsState; import ee.carlrobert.codegpt.toolwindow.chat.components.ResponsePanel; -import ee.carlrobert.codegpt.util.SwingUtils; +import ee.carlrobert.codegpt.util.UIUtil; import java.awt.event.MouseEvent; import javax.swing.JTextPane; import javax.swing.event.HyperlinkEvent; @@ -24,7 +24,7 @@ class StandardChatToolWindowLandingPanel extends ResponsePanel { } private JTextPane createContent() { - var textPane = SwingUtils.createTextPane( + var textPane = UIUtil.createTextPane( "" + format( "

" @@ -79,7 +79,7 @@ class StandardChatToolWindowLandingPanel extends ResponsePanel { LOG.error("Could not trigger action {}", event.getDescription()); } } else { - SwingUtils.handleHyperlinkClicked(event); + UIUtil.handleHyperlinkClicked(event); } } } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/standard/StandardChatToolWindowTabPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/standard/StandardChatToolWindowTabPanel.java index 4940e2fe..d359d86c 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/standard/StandardChatToolWindowTabPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/standard/StandardChatToolWindowTabPanel.java @@ -11,9 +11,9 @@ import ee.carlrobert.codegpt.toolwindow.chat.BaseChatToolWindowTabPanel; import ee.carlrobert.codegpt.toolwindow.chat.components.ChatMessageResponseBody; import ee.carlrobert.codegpt.toolwindow.chat.components.ResponsePanel; import ee.carlrobert.codegpt.toolwindow.chat.components.UserMessagePanel; -import ee.carlrobert.codegpt.util.EditorUtils; -import ee.carlrobert.codegpt.util.OverlayUtils; -import ee.carlrobert.codegpt.util.file.FileUtils; +import ee.carlrobert.codegpt.util.EditorUtil; +import ee.carlrobert.codegpt.util.OverlayUtil; +import ee.carlrobert.codegpt.util.file.FileUtil; import javax.swing.JComponent; import org.jetbrains.annotations.NotNull; @@ -34,16 +34,16 @@ public class StandardChatToolWindowTabPanel extends BaseChatToolWindowTabPanel { @Override protected JComponent getLandingView() { return new StandardChatToolWindowLandingPanel((action, locationOnScreen) -> { - var editor = EditorUtils.getSelectedEditor(project); + var editor = EditorUtil.getSelectedEditor(project); if (editor == null || !editor.getSelectionModel().hasSelection()) { - OverlayUtils.showWarningBalloon( + OverlayUtil.showWarningBalloon( editor == null ? "Unable to locate a selected editor" : "Please select a target code before proceeding", locationOnScreen); return; } - var fileExtension = FileUtils.getFileExtension( + var fileExtension = FileUtil.getFileExtension( ((EditorImpl) editor).getVirtualFile().getName()); var message = new Message(action.getPrompt().replace( "{{selectedCode}}", diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/conversations/ConversationPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/conversations/ConversationPanel.java index 365a1b08..88752ae7 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/conversations/ConversationPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/conversations/ConversationPanel.java @@ -1,6 +1,6 @@ package ee.carlrobert.codegpt.toolwindow.conversations; -import static ee.carlrobert.codegpt.util.ThemeUtils.getPanelBackgroundColor; +import static ee.carlrobert.codegpt.util.UIUtil.getPanelBackgroundColor; import com.intellij.openapi.project.Project; import com.intellij.ui.JBColor; diff --git a/src/main/java/ee/carlrobert/codegpt/util/ApplicationUtils.java b/src/main/java/ee/carlrobert/codegpt/util/ApplicationUtil.java similarity index 97% rename from src/main/java/ee/carlrobert/codegpt/util/ApplicationUtils.java rename to src/main/java/ee/carlrobert/codegpt/util/ApplicationUtil.java index 93fe0ba0..689eb346 100644 --- a/src/main/java/ee/carlrobert/codegpt/util/ApplicationUtils.java +++ b/src/main/java/ee/carlrobert/codegpt/util/ApplicationUtil.java @@ -8,7 +8,7 @@ import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.openapi.wm.IdeFrame; import org.jetbrains.annotations.Nullable; -public class ApplicationUtils { +public class ApplicationUtil { public static boolean isUnitTestingMode() { Application app = ApplicationManager.getApplication(); diff --git a/src/main/java/ee/carlrobert/codegpt/util/DownloadingUtils.java b/src/main/java/ee/carlrobert/codegpt/util/DownloadingUtil.java similarity index 83% rename from src/main/java/ee/carlrobert/codegpt/util/DownloadingUtils.java rename to src/main/java/ee/carlrobert/codegpt/util/DownloadingUtil.java index 2d3992a0..b4a8ce81 100644 --- a/src/main/java/ee/carlrobert/codegpt/util/DownloadingUtils.java +++ b/src/main/java/ee/carlrobert/codegpt/util/DownloadingUtil.java @@ -2,9 +2,9 @@ package ee.carlrobert.codegpt.util; import static java.lang.String.format; -import ee.carlrobert.codegpt.util.file.FileUtils; +import ee.carlrobert.codegpt.util.file.FileUtil; -public class DownloadingUtils { +public class DownloadingUtil { private static final int BYTES_IN_MB = 1024 * 1024; @@ -19,8 +19,8 @@ public class DownloadingUtils { return format( "%s of %s (%.2f%%), Speed: %.2f MB/sec, Time left: %s", - FileUtils.convertFileSize((long) downloadedMB * BYTES_IN_MB), - FileUtils.convertFileSize((long) totalMB * BYTES_IN_MB), + FileUtil.convertFileSize((long) downloadedMB * BYTES_IN_MB), + FileUtil.convertFileSize((long) totalMB * BYTES_IN_MB), percent, speed, getTimeLeftFormattedString(speed, remainingMB)); diff --git a/src/main/java/ee/carlrobert/codegpt/util/EditorUtils.java b/src/main/java/ee/carlrobert/codegpt/util/EditorUtil.java similarity index 97% rename from src/main/java/ee/carlrobert/codegpt/util/EditorUtils.java rename to src/main/java/ee/carlrobert/codegpt/util/EditorUtil.java index caec1c2e..5ead5d67 100644 --- a/src/main/java/ee/carlrobert/codegpt/util/EditorUtils.java +++ b/src/main/java/ee/carlrobert/codegpt/util/EditorUtil.java @@ -20,7 +20,7 @@ import java.time.format.DateTimeFormatter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public final class EditorUtils { +public final class EditorUtil { public static Editor createEditor(@NotNull Project project, String fileExtension, String code) { var timestamp = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").format(LocalDateTime.now()); @@ -53,7 +53,7 @@ public final class EditorUtils { } public static @Nullable String getSelectedEditorSelectedText(@NotNull Project project) { - var selectedEditor = EditorUtils.getSelectedEditor(project); + var selectedEditor = EditorUtil.getSelectedEditor(project); if (selectedEditor != null) { return selectedEditor.getSelectionModel().getSelectedText(); } diff --git a/src/main/java/ee/carlrobert/codegpt/util/MarkdownUtils.java b/src/main/java/ee/carlrobert/codegpt/util/MarkdownUtil.java similarity index 97% rename from src/main/java/ee/carlrobert/codegpt/util/MarkdownUtils.java rename to src/main/java/ee/carlrobert/codegpt/util/MarkdownUtil.java index 8b310aed..0bca505b 100644 --- a/src/main/java/ee/carlrobert/codegpt/util/MarkdownUtils.java +++ b/src/main/java/ee/carlrobert/codegpt/util/MarkdownUtil.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class MarkdownUtils { +public class MarkdownUtil { /** * Splits a given string into a list of strings where each element is either a code block diff --git a/src/main/java/ee/carlrobert/codegpt/util/OverlayUtils.java b/src/main/java/ee/carlrobert/codegpt/util/OverlayUtil.java similarity index 98% rename from src/main/java/ee/carlrobert/codegpt/util/OverlayUtils.java rename to src/main/java/ee/carlrobert/codegpt/util/OverlayUtil.java index 0bffe6bf..c54f9c09 100644 --- a/src/main/java/ee/carlrobert/codegpt/util/OverlayUtils.java +++ b/src/main/java/ee/carlrobert/codegpt/util/OverlayUtil.java @@ -33,7 +33,7 @@ import java.awt.event.MouseEvent; import javax.swing.JComponent; import org.jetbrains.annotations.NotNull; -public class OverlayUtils { +public class OverlayUtil { public static void showNotification(String content, NotificationType type) { Notifications.Bus.notify( @@ -134,7 +134,7 @@ public class OverlayUtils { locationOnScreen.y = locationOnScreen.y - 16; showWarningBalloon( - EditorUtils.getSelectedEditor(requireNonNull(event.getProject())) == null + EditorUtil.getSelectedEditor(requireNonNull(event.getProject())) == null ? "Unable to locate a selected editor" : "Please select a target code before proceeding", locationOnScreen); diff --git a/src/main/java/ee/carlrobert/codegpt/util/ThemeUtils.java b/src/main/java/ee/carlrobert/codegpt/util/ThemeUtils.java deleted file mode 100644 index 78f821bd..00000000 --- a/src/main/java/ee/carlrobert/codegpt/util/ThemeUtils.java +++ /dev/null @@ -1,27 +0,0 @@ -package ee.carlrobert.codegpt.util; - -import static java.lang.String.format; - -import com.intellij.util.ui.UIUtil; -import java.awt.Color; - -public class ThemeUtils { - - public static Color getPanelBackgroundColor() { - var panelBg = UIUtil.getPanelBackground(); - return UIUtil.isUnderDarcula() ? toDarker(panelBg) : panelBg.brighter(); - } - - private static Color toDarker(Color color) { - var factor = 0.9; - return new Color( - Math.max((int) (color.getRed() * factor), 0), - Math.max((int) (color.getGreen() * factor), 0), - Math.max((int) (color.getBlue() * factor), 0), - color.getAlpha()); - } - - public static String getRGB(Color color) { - return format("rgb(%d, %d, %d)", color.getRed(), color.getGreen(), color.getBlue()); - } -} diff --git a/src/main/java/ee/carlrobert/codegpt/util/SwingUtils.java b/src/main/java/ee/carlrobert/codegpt/util/UIUtil.java similarity index 75% rename from src/main/java/ee/carlrobert/codegpt/util/SwingUtils.java rename to src/main/java/ee/carlrobert/codegpt/util/UIUtil.java index 128306ab..afaa33f7 100644 --- a/src/main/java/ee/carlrobert/codegpt/util/SwingUtils.java +++ b/src/main/java/ee/carlrobert/codegpt/util/UIUtil.java @@ -1,14 +1,17 @@ package ee.carlrobert.codegpt.util; +import static com.intellij.util.ui.UIUtil.isUnderDarcula; import static javax.swing.event.HyperlinkEvent.EventType.ACTIVATED; import com.intellij.ide.BrowserUtil; import com.intellij.openapi.roots.ui.componentsList.components.ScrollablePanel; +import com.intellij.ui.ColorUtil; +import com.intellij.ui.JBColor; import com.intellij.ui.ScrollPaneFactory; import com.intellij.util.ui.UI; import ee.carlrobert.codegpt.toolwindow.chat.components.SmartScroller; +import java.awt.Color; import java.awt.Dimension; -import java.awt.event.ActionEvent; import java.net.URISyntaxException; import javax.swing.AbstractAction; import javax.swing.BorderFactory; @@ -25,10 +28,10 @@ import javax.swing.ScrollPaneConstants; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; -public class SwingUtils { +public class UIUtil { public static JTextPane createTextPane(String text) { - return createTextPane(text, SwingUtils::handleHyperlinkClicked); + return createTextPane(text, UIUtil::handleHyperlinkClicked); } public static JTextPane createTextPane(String text, HyperlinkListener listener) { @@ -72,25 +75,26 @@ public class SwingUtils { } public static void handleHyperlinkClicked(HyperlinkEvent event) { - if (ACTIVATED.equals(event.getEventType()) && event.getURL() != null) { + var url = event.getURL(); + if (ACTIVATED.equals(event.getEventType()) && url != null) { try { - BrowserUtil.browse(event.getURL().toURI()); + BrowserUtil.browse(url.toURI()); } catch (URISyntaxException e) { throw new RuntimeException(e); } } } - public static void addShiftEnterInputMap(JTextArea textArea, Runnable onSubmit) { - var enterStroke = KeyStroke.getKeyStroke("ENTER"); - var shiftEnterStroke = KeyStroke.getKeyStroke("shift ENTER"); - textArea.getInputMap().put(shiftEnterStroke, "insert-break"); - textArea.getInputMap().put(enterStroke, "text-submit"); - textArea.getActionMap().put("text-submit", new AbstractAction() { - public void actionPerformed(ActionEvent e) { - onSubmit.run(); - } - }); + public static void addShiftEnterInputMap(JTextArea textArea, AbstractAction onSubmit) { + textArea.getInputMap().put(KeyStroke.getKeyStroke("shift ENTER"), "insert-break"); + textArea.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "text-submit"); + textArea.getActionMap().put("text-submit", onSubmit); + } + + public static Color getPanelBackgroundColor() { + return isUnderDarcula() + ? ColorUtil.darker(JBColor.PanelBackground, 1) + : JBColor.PanelBackground.brighter(); } } diff --git a/src/main/java/ee/carlrobert/codegpt/util/file/FileUtils.java b/src/main/java/ee/carlrobert/codegpt/util/file/FileUtil.java similarity index 92% rename from src/main/java/ee/carlrobert/codegpt/util/file/FileUtils.java rename to src/main/java/ee/carlrobert/codegpt/util/file/FileUtil.java index 7fd95700..e0f6a551 100644 --- a/src/main/java/ee/carlrobert/codegpt/util/file/FileUtils.java +++ b/src/main/java/ee/carlrobert/codegpt/util/file/FileUtil.java @@ -7,7 +7,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.progress.ProgressIndicator; -import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import ee.carlrobert.codegpt.CodeGPTPlugin; import java.io.File; @@ -31,9 +30,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.jetbrains.annotations.NotNull; -public class FileUtils { +public class FileUtil { - private static final Logger LOG = Logger.getInstance(FileUtils.class); + private static final Logger LOG = Logger.getInstance(FileUtil.class); public static File createFile(String directoryPath, String fileName, String fileContent) { try { @@ -53,7 +52,7 @@ public class FileUtils { long[] bytesRead, long fileSize, ProgressIndicator indicator) throws IOException { - FileUtils.tryCreateDirectory(CodeGPTPlugin.getLlamaModelsPath()); + FileUtil.tryCreateDirectory(CodeGPTPlugin.getLlamaModelsPath()); try ( var readableByteChannel = Channels.newChannel(url.openStream()); @@ -80,8 +79,9 @@ public class FileUtils { public static void tryCreateDirectory(String directoryPath) { try { - if (!FileUtil.exists(directoryPath)) { - if (!FileUtil.createDirectory(Path.of(directoryPath).toFile())) { + if (!com.intellij.openapi.util.io.FileUtil.exists(directoryPath)) { + if (!com.intellij.openapi.util.io.FileUtil.createDirectory( + Path.of(directoryPath).toFile())) { throw new IOException("Failed to create directory: " + directoryPath); } } @@ -142,7 +142,7 @@ public class FileUtils { } public static String getResourceContent(String name) { - try (var stream = Objects.requireNonNull(FileUtils.class.getResourceAsStream(name))) { + try (var stream = Objects.requireNonNull(FileUtil.class.getResourceAsStream(name))) { return new String(stream.readAllBytes(), StandardCharsets.UTF_8); } catch (IOException e) { throw new RuntimeException("Unable to read resource", e); diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index b303a719..1e8d60c9 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -4,6 +4,11 @@ Carl-Robert Linnupuu com.intellij.modules.platform + + + +