/*
* Copyright 2008-2017 by Emeric Vernat
*
* This file is part of Java Melody.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.bull.javamelody.swing;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
/**
* TabbedPane.<br>
* On ne laisse qu'un constructeur qui positionne TAB_PLACEMENT à TOP et TAB_LAYOUT_POLICY à
* SCROLL_TAB_LAYOUT.
*
* @author Emeric Vernat
*/
public class MTabbedPane extends JTabbedPane {
private static final long serialVersionUID = 1L;
@SuppressWarnings("all")
private static final MouseWheelScroller MOUSE_WHEEL_SCROLLER = new MouseWheelScroller();
@SuppressWarnings("all")
private static final TabSelectionMouseHandler TAB_SELECTION_MOUSE_HANDLER = new TabSelectionMouseHandler();
private static class MouseWheelScroller implements MouseWheelListener {
@Override
public void mouseWheelMoved(MouseWheelEvent event) {
final MTabbedPane tabbedPane = (MTabbedPane) event.getSource();
tabbedPane.mouseWheelMoved(event);
}
}
private static class TabSelectionMouseHandler extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent event) {
final MTabbedPane tabbedPane = (MTabbedPane) event.getSource();
tabbedPane.mouseClicked(event);
}
}
private class MenuSelectionHandler implements ActionListener {
MenuSelectionHandler() {
super();
}
@Override
public void actionPerformed(ActionEvent event) {
final JMenuItem menuItem = (JMenuItem) event.getSource();
setSelectedIndex(Integer.parseInt(menuItem.getName()));
}
}
/**
* Constructeur.
*/
public MTabbedPane() {
super(TOP);
// pas SCROLL_TAB_LAYOUT car en Look and feel Nimbus la bordure sous les onglets ne s'afficherait pas
initListeners();
}
/**
* Initialisation des listeners.
*/
private void initListeners() {
// listeners inspirés de Patrick Gotthardt's Weblog
addMouseListener(TAB_SELECTION_MOUSE_HANDLER);
addMouseWheelListener(MOUSE_WHEEL_SCROLLER);
}
void mouseWheelMoved(MouseWheelEvent event) {
final int dir = event.getWheelRotation() > 0 ? 1 : -1; // wheelRotation
// peut valoir 2 ou -2 par ex.
int selIndex = getSelectedIndex();
final int maxIndex = getTabCount() - 1;
if (selIndex == 0 && dir < 0 || selIndex == maxIndex && dir > 0) {
selIndex = maxIndex - selIndex;
} else {
selIndex += dir;
}
setSelectedIndex(selIndex);
}
void mouseClicked(MouseEvent event) {
// we only look at the right button
if (SwingUtilities.isRightMouseButton(event)) {
final JPopupMenu menu = createPopupMenu();
menu.show(this, event.getX(), event.getY());
}
}
protected JPopupMenu createPopupMenu() {
final JPopupMenu menu = new JPopupMenu();
final MenuSelectionHandler menuSelectionHandler = new MenuSelectionHandler();
final int tabCount = getTabCount();
final int selectedIndex = getSelectedIndex();
for (int i = 0; i < tabCount; i++) {
final JMenuItem menuItem = new JMenuItem(getTitleAt(i), getIconAt(i));
if (i == selectedIndex) {
menuItem.setFont(menuItem.getFont().deriveFont(Font.BOLD));
}
if (!isEnabledAt(i)) {
menuItem.setEnabled(false);
}
menuItem.setName(String.valueOf(i));
menuItem.addActionListener(menuSelectionHandler);
menu.add(menuItem);
}
return menu;
}
}