2019-12-11 14:02:31 +01:00
|
|
|
package dev.kske.chess.ui;
|
|
|
|
|
2020-01-19 22:12:33 +01:00
|
|
|
import java.awt.*;
|
2019-12-11 21:23:35 +01:00
|
|
|
import java.awt.event.MouseAdapter;
|
|
|
|
import java.awt.event.MouseEvent;
|
2019-12-11 14:02:31 +01:00
|
|
|
|
2020-01-19 22:12:33 +01:00
|
|
|
import javax.swing.*;
|
2019-12-11 21:23:35 +01:00
|
|
|
import javax.swing.plaf.basic.BasicButtonUI;
|
2019-12-11 14:02:31 +01:00
|
|
|
|
|
|
|
/**
|
2020-01-19 22:12:33 +01:00
|
|
|
* Renders the title and the closing button of a {@link JTabbedPane}.<br>
|
|
|
|
* <br>
|
2019-12-11 14:02:31 +01:00
|
|
|
* Project: <strong>Chess</strong><br>
|
|
|
|
* File: <strong>GameTabComponent.java</strong><br>
|
|
|
|
* Created: <strong>11 Dec 2019</strong><br>
|
|
|
|
*
|
|
|
|
* @author Kai S. K. Engelbart
|
|
|
|
*/
|
|
|
|
public class GameTabComponent extends JPanel {
|
|
|
|
|
2019-12-11 21:23:35 +01:00
|
|
|
private final JTabbedPane tabbedPane;
|
|
|
|
|
2019-12-11 14:02:31 +01:00
|
|
|
private static final long serialVersionUID = 9022979950018125935L;
|
|
|
|
|
2020-01-19 22:12:33 +01:00
|
|
|
/**
|
|
|
|
* Creates an instance of {@link GameTabComponent}.
|
|
|
|
*
|
|
|
|
* @param tabbedPane the tabbed pane which contains this
|
|
|
|
* {@link GameTabComponent}
|
|
|
|
*/
|
2019-12-11 14:02:31 +01:00
|
|
|
public GameTabComponent(JTabbedPane tabbedPane) {
|
|
|
|
super(new FlowLayout(FlowLayout.LEFT, 0, 0));
|
2020-05-19 16:50:12 +02:00
|
|
|
if (tabbedPane == null)
|
|
|
|
throw new NullPointerException("TabbedPane is null");
|
2019-12-11 21:23:35 +01:00
|
|
|
this.tabbedPane = tabbedPane;
|
2019-12-11 14:02:31 +01:00
|
|
|
|
|
|
|
// Create title JLabel
|
2019-12-11 21:23:35 +01:00
|
|
|
JLabel label = new JLabel() {
|
2019-12-11 14:02:31 +01:00
|
|
|
|
|
|
|
private static final long serialVersionUID = 7902391411509551586L;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getText() {
|
|
|
|
int i = tabbedPane.indexOfTabComponent(GameTabComponent.this);
|
|
|
|
return i != -1 ? tabbedPane.getTitleAt(i) : "";
|
|
|
|
}
|
2019-12-11 21:23:35 +01:00
|
|
|
};
|
|
|
|
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
|
|
|
|
add(label);
|
|
|
|
|
|
|
|
// Create close JButton
|
|
|
|
add(new TabButton());
|
|
|
|
setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
|
|
|
|
}
|
|
|
|
|
|
|
|
private class TabButton extends JButton {
|
|
|
|
|
|
|
|
private static final long serialVersionUID = -2757857832337636731L;
|
|
|
|
|
|
|
|
public TabButton() {
|
|
|
|
final int size = 17;
|
|
|
|
setPreferredSize(new Dimension(size, size));
|
|
|
|
setToolTipText("Close this tab");
|
|
|
|
setUI(new BasicButtonUI());
|
|
|
|
setContentAreaFilled(false);
|
|
|
|
setFocusable(false);
|
|
|
|
setBorder(BorderFactory.createEtchedBorder());
|
|
|
|
setBorderPainted(false);
|
|
|
|
addMouseListener(new MouseAdapter() {
|
|
|
|
|
|
|
|
@Override
|
2020-05-19 16:50:12 +02:00
|
|
|
public void mouseEntered(MouseEvent evt) {
|
|
|
|
setBorderPainted(true);
|
|
|
|
}
|
2019-12-11 21:23:35 +01:00
|
|
|
|
|
|
|
@Override
|
2020-05-19 16:50:12 +02:00
|
|
|
public void mouseExited(MouseEvent evt) {
|
|
|
|
setBorderPainted(false);
|
|
|
|
}
|
2019-12-11 21:23:35 +01:00
|
|
|
});
|
|
|
|
setRolloverEnabled(true);
|
2020-05-19 16:50:12 +02:00
|
|
|
addActionListener(evt -> {
|
|
|
|
int i = tabbedPane.indexOfTabComponent(GameTabComponent.this);
|
|
|
|
if (i != -1)
|
|
|
|
tabbedPane.remove(i);
|
|
|
|
});
|
2019-12-11 21:23:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void updateUI() {}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void paintComponent(Graphics g) {
|
|
|
|
super.paintComponent(g);
|
|
|
|
Graphics2D g2 = (Graphics2D) g.create();
|
|
|
|
// shift the image for pressed buttons
|
2020-05-19 16:50:12 +02:00
|
|
|
if (getModel().isPressed())
|
|
|
|
g2.translate(1, 1);
|
2019-12-11 21:23:35 +01:00
|
|
|
g2.setStroke(new BasicStroke(2));
|
|
|
|
g2.setColor(Color.BLACK);
|
2020-05-19 16:50:12 +02:00
|
|
|
if (getModel().isRollover())
|
|
|
|
g2.setColor(Color.MAGENTA);
|
2019-12-11 21:23:35 +01:00
|
|
|
final int delta = 6;
|
2020-05-19 16:50:12 +02:00
|
|
|
g2.drawLine(
|
|
|
|
delta,
|
|
|
|
delta,
|
|
|
|
getWidth() - delta - 1,
|
|
|
|
getHeight() - delta - 1
|
|
|
|
);
|
|
|
|
g2.drawLine(
|
|
|
|
getWidth() - delta - 1,
|
|
|
|
delta,
|
|
|
|
delta,
|
|
|
|
getHeight() - delta - 1
|
|
|
|
);
|
2019-12-11 21:23:35 +01:00
|
|
|
g2.dispose();
|
|
|
|
}
|
2019-12-11 14:02:31 +01:00
|
|
|
}
|
|
|
|
}
|