ProxyAI/src/main/java/ee/carlrobert/codegpt/toolwindow/conversations/ConversationsToolWindow.java
2023-03-22 23:42:32 +00:00

122 lines
5 KiB
Java

package ee.carlrobert.codegpt.toolwindow.conversations;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.ActionToolbar;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ui.componentsList.components.ScrollablePanel;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.util.ui.JBFont;
import com.intellij.util.ui.JBUI;
import ee.carlrobert.codegpt.conversations.Conversation;
import ee.carlrobert.codegpt.conversations.ConversationsState;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.toolwindow.ContentManagerService;
import ee.carlrobert.codegpt.toolwindow.chat.ChatToolWindowPanel;
import ee.carlrobert.codegpt.toolwindow.conversations.actions.ClearAllConversationsAction;
import ee.carlrobert.codegpt.toolwindow.conversations.actions.DeleteConversationAction;
import ee.carlrobert.codegpt.toolwindow.conversations.actions.MoveDownAction;
import ee.carlrobert.codegpt.toolwindow.conversations.actions.MoveUpAction;
import ee.carlrobert.openai.client.ClientCode;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import org.jetbrains.annotations.NotNull;
public class ConversationsToolWindow {
private final Project project;
private JPanel conversationsToolWindowContent;
private JScrollPane scrollPane;
private ScrollablePanel scrollablePanel;
public ConversationsToolWindow(@NotNull Project project) {
this.project = project;
refresh();
}
public JPanel getContent() {
SimpleToolWindowPanel panel = new SimpleToolWindowPanel(true);
panel.setContent(conversationsToolWindowContent);
var actionGroup = new DefaultActionGroup("TOOLBAR_ACTION_GROUP", false);
actionGroup.add(new MoveDownAction(this::refresh));
actionGroup.add(new MoveUpAction(this::refresh));
actionGroup.addSeparator();
actionGroup.add(new DeleteConversationAction(this::refresh));
actionGroup.add(new ClearAllConversationsAction(this::refresh));
ActionToolbar actionToolbar = ActionManager.getInstance()
.createActionToolbar("NAVIGATION_BAR_TOOLBAR", actionGroup, true);
panel.setToolbar(actionToolbar.getComponent());
return panel;
}
public void refresh() {
scrollablePanel.removeAll();
var sortedConversations = ConversationsState.getInstance().getSortedConversations();
if (sortedConversations.isEmpty()) {
var emptyLabel = new JLabel("No conversations exist.");
emptyLabel.setFont(JBFont.h2());
emptyLabel.setBorder(JBUI.Borders.empty(8));
scrollablePanel.add(emptyLabel);
} else {
sortedConversations.forEach(this::addContent);
}
scrollablePanel.revalidate();
scrollablePanel.repaint();
}
private void addContent(Conversation conversation) {
var mainPanel = new RootConversationPanel(() -> {
ConversationsState.getInstance().setCurrentConversation(conversation);
changeSettings(conversation);
var contentManagerService = project.getService(ContentManagerService.class);
contentManagerService.displayChatTab(project);
contentManagerService.tryFindChatTabbedPane(project)
.ifPresent(tabbedPane -> tabbedPane.tryFindActiveConversationIndex(conversation.getId())
.ifPresentOrElse(tabbedPane::setSelectedIndex, () -> {
var panel = new ChatToolWindowPanel(project);
panel.displayConversation(conversation);
tabbedPane.addTab("Chat " + (tabbedPane.getTabCount() + 1), panel);
tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
}));
});
var currentConversation = ConversationsState.getCurrentConversation();
var isSelected = currentConversation != null && currentConversation.getId().equals(conversation.getId());
mainPanel.add(new ConversationPanel(conversation, isSelected));
mainPanel.setBackground(conversationsToolWindowContent.getBackground());
scrollablePanel.add(mainPanel);
}
private void changeSettings(Conversation conversation) {
var settings = SettingsState.getInstance();
var isChatCompletions = ClientCode.CHAT_COMPLETION.equals(conversation.getClientCode());
if (isChatCompletions) {
settings.chatCompletionBaseModel = conversation.getModel();
} else {
settings.textCompletionBaseModel = conversation.getModel();
}
settings.isChatCompletionOptionSelected = isChatCompletions;
settings.isTextCompletionOptionSelected = !isChatCompletions;
}
private void createUIComponents() {
scrollablePanel = new ScrollablePanel();
scrollablePanel.setLayout(new BoxLayout(scrollablePanel, BoxLayout.Y_AXIS));
scrollPane = new JBScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setViewportView(scrollablePanel);
scrollPane.setBorder(null);
scrollPane.setViewportBorder(null);
}
}