feat(gui): tabs UI improvements (PR #2419)

* Adds "Reveal In Explorer" tab, to focus on on the current class's tree node

* Adds separators between tab categories, similar to how tabs look in VSCode/IntelliJ

* Rename from reveal_in_explorer to reveal_in_tree

* Minor fixes

* Handle mouse presses on tabs better

* use exist action name instead new one

---------

Co-authored-by: glu0n <glu0n@gmail.com>
Co-authored-by: Skylot <118523+skylot@users.noreply.github.com>
This commit is contained in:
yyyair
2025-02-22 20:46:00 +02:00
committed by GitHub
parent b78d3aa2f7
commit 4a9276e904
2 changed files with 23 additions and 0 deletions
@@ -230,6 +230,14 @@ public class TabComponent extends JPanel {
JMenuItem unbookmarkAll = new JMenuItem(NLS.str("tabs.unbookmark_all"));
unbookmarkAll.addActionListener(e -> tabsController.unbookmarkAllTabs());
menu.add(unbookmarkAll);
menu.addSeparator();
}
if (nodeFullName != null) {
JMenuItem revealTab = new JMenuItem(NLS.str("menu.sync"));
revealTab.addActionListener(e -> tabsController.getMainWindow().selectNodeInTree(getNode()));
menu.add(revealTab);
menu.addSeparator();
}
JMenuItem closeTab = new JMenuItem(NLS.str("tabs.close"));
@@ -6,6 +6,8 @@ import java.awt.KeyboardFocusManager;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashSet;
@@ -58,6 +60,19 @@ public class TabbedPane extends JTabbedPane implements ITabStatesListener {
controller.addListener(this);
setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
MouseAdapter clickAdapter = new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int tabIndex = indexAtLocation(e.getX(), e.getY());
if (tabIndex == -1 || tabIndex > getTabCount()) {
return;
}
TabComponent tab = (TabComponent) getTabComponentAt(tabIndex);
tab.dispatchEvent(e);
}
};
addMouseListener(clickAdapter);
addMouseWheelListener(event -> {
if (dnd != null && dnd.isDragging()) {
return;