diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/SelectedFilesAccordion.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/SelectedFilesAccordion.java index 841e4059..31566c4d 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/SelectedFilesAccordion.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/SelectedFilesAccordion.java @@ -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 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 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 referencedFilePaths) { - var html = referencedFilePaths.stream() - .map(filePath -> format( - "
  • %s
  • ", - filePath, - Paths.get(filePath).getFileName().toString())) - .collect(Collectors.joining()); - return format("
      %s
    ", 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);