feat: replace editor pane with action links

This commit is contained in:
Carl-Robert Linnupuu 2023-12-13 16:52:35 +02:00
parent ee4d1e8da6
commit 6824fbeb3b

View file

@ -1,25 +1,22 @@
package ee.carlrobert.codegpt.toolwindow.chat.ui;
import static java.lang.String.format;
import static javax.swing.event.HyperlinkEvent.EventType.ACTIVATED;
import com.intellij.icons.AllIcons.General;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.components.ActionLink;
import com.intellij.util.ui.JBUI;
import ee.carlrobert.codegpt.ui.UIUtil;
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.nio.file.Paths;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import org.jetbrains.annotations.NotNull;
@ -32,37 +29,39 @@ public class SelectedFilesAccordion extends JPanel {
super(new BorderLayout());
setOpaque(false);
var contentPanel = createContentPane(project, referencedFilePaths);
var contentPanel = createContentPanel(project, referencedFilePaths);
add(createToggleButton(contentPanel, referencedFilePaths.size()), BorderLayout.NORTH);
add(contentPanel, BorderLayout.CENTER);
}
private JTextPane createContentPane(Project project, List<String> referencedFilePaths) {
var textPane = UIUtil.createTextPane(
getHtml(referencedFilePaths),
false,
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);
}
private JPanel createContentPanel(Project project, List<String> referencedFilePaths) {
var panel = new JPanel();
panel.setOpaque(false);
panel.setVisible(false);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(JBUI.Borders.emptyBottom(4));
referencedFilePaths.stream()
.map(filePath -> LocalFileSystem.getInstance().findFileByPath(filePath))
.filter(Objects::nonNull)
.map(virtualFile -> {
var actionLink = new ActionLink(
Paths.get(virtualFile.getPath()).getFileName().toString(),
(event) -> {
FileEditorManager.getInstance(project)
.openFile(Objects.requireNonNull(virtualFile), true);
});
actionLink.setIcon(
FileTypeManager.getInstance().getFileTypeByFile(virtualFile).getIcon());
return actionLink;
})
.forEach(link -> {
panel.add(link);
panel.add(Box.createVerticalStrut(4));
});
textPane.setBorder(JBUI.Borders.emptyBottom(8));
textPane.setVisible(false);
return textPane;
return panel;
}
private String getHtml(List<String> referencedFilePaths) {
var html = referencedFilePaths.stream()
.map(filePath -> format(
"<li><a href=\"%s\">%s</a></li>",
filePath,
Paths.get(filePath).getFileName().toString()))
.collect(Collectors.joining());
return format("<ul style=\"margin: 4px 12px;\">%s</ul>", html);
}
private JToggleButton createToggleButton(JTextPane contentPane, int fileCount) {
private JToggleButton createToggleButton(JPanel contentPane, int fileCount) {
var accordionToggle = new JToggleButton(
format("Referenced files (+%d)", fileCount), General.ArrowDown);
accordionToggle.setFocusPainted(false);