diff --git a/ts3-client/swing/src/main/java/com/ts3client/ui/ServerTabPane.java b/ts3-client/swing/src/main/java/com/ts3client/ui/ServerTabPane.java index 9567c71..9fa799b 100644 --- a/ts3-client/swing/src/main/java/com/ts3client/ui/ServerTabPane.java +++ b/ts3-client/swing/src/main/java/com/ts3client/ui/ServerTabPane.java @@ -7,11 +7,13 @@ import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; import java.util.ArrayList; import java.util.List; @@ -48,6 +50,24 @@ final class ServerTabPane extends JPanel { int i = tabbed.getSelectedIndex(); if (i >= 0 && i < tabs.size()) listener.selectTab(tabs.get(i)); }); + tabbed.addMouseWheelListener(this::onWheel); + } + + /** + * Scrolling over the tab strip steps through the connections. The content + * area keeps its own scrolling, so only wheel events on the strip itself + * (and on the tab labels, which forward theirs) change tabs. + */ + private void onWheel(MouseWheelEvent e) { + if (!tabbedMode) return; + Component content = tabbed.getSelectedComponent(); + if (content != null && content.getBounds().contains(e.getPoint())) return; + + int steps = e.getWheelRotation(); + if (steps == 0) return; + int target = Math.max(0, Math.min(tabs.size() - 1, tabbed.getSelectedIndex() + steps)); + if (target != tabbed.getSelectedIndex()) listener.selectTab(tabs.get(target)); + e.consume(); } void addTab(ServerTab tab) {