/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package jifi.ui.view.tabbedpaneview.dndtabbedpane;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.basic.BasicButtonUI;
import jifi.ui.view.View.ViewData;
/**
*
* @author antunes2
*/
public class TabComponent extends JPanel {
private final JTabbedPane pane;
private final JLabel label;
private final JIcon jicon;
private final JButton button;
public TabComponent(final JTabbedPane pane) {
super.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
// super.setLayout(new BoxLayout(this,BoxLayout.LINE_AXIS));
if (pane == null) {
throw new NullPointerException("TabbedPane is null");
} else {
this.pane = pane;
}
setOpaque(false);
//add more space to the top of the component
setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
label = new JLabel();
//add more space between the label and the button
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
jicon = new JIcon(null);
button = new TabButton();
add(jicon);
add(label);
add(button);
// button.setPreferredSize(new Dimension(15,15));
//
// //make JLabel read titles from JTabbedPane
// JLabel label = new JLabel() {
// public String getText() {
// int i = pane.indexOfTabComponent(TabComponent.this);
// if (i != -1) {
// return pane.getTitleAt(i);
// }
// return null;
// }
// };
}
public void update(ViewData data) {
jicon.setIcon(data.getIcon());
label.setText(data.getTitle());
}
private class TabButton extends JButton implements ActionListener {
public TabButton() {
int size = 17;
setPreferredSize(new Dimension(size, size));
setToolTipText("close this tab");
//Make the button looks the same for all Laf's
setUI(new BasicButtonUI());
//Make it transparent
setContentAreaFilled(false);
//No need to be focusable
setFocusable(false);
setBorder(BorderFactory.createEtchedBorder());
setBorderPainted(false);
//Making nice rollover effect
//we use the same listener for all buttons
addMouseListener(buttonMouseListener);
setRolloverEnabled(true);
//Close the proper tab by clicking the button
addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
int i = pane.indexOfTabComponent(TabComponent.this);
if (i != -1) {
pane.remove(i);
}
}
//we don't want to update UI for this button
public void updateUI() {
}
//paint the cross
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
//shift the image for pressed buttons
if (getModel().isPressed()) {
g2.translate(1, 1);
}
g2.setStroke(new BasicStroke(2));
g2.setColor(Color.BLACK);
if (getModel().isRollover()) {
g2.setColor(Color.RED);
}
int delta = 6;
g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
g2.dispose();
}
}
private final static MouseListener buttonMouseListener = new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
Component component = e.getComponent();
if (component instanceof AbstractButton) {
AbstractButton button = (AbstractButton) component;
button.setBorderPainted(true);
}
}
public void mouseExited(MouseEvent e) {
Component component = e.getComponent();
if (component instanceof AbstractButton) {
AbstractButton button = (AbstractButton) component;
button.setBorderPainted(false);
}
}
};
class JIcon extends JComponent {
private Icon icon;
public JIcon(Icon icon) {
this.icon = icon;
}
@Override
public void paintComponent(Graphics g) {
if (icon != null) {
icon.paintIcon(this, g, 0, 0);
}
}
@Override
public Dimension getPreferredSize() {
if (icon != null) {
return new Dimension(icon.getIconWidth() + 5, icon.getIconHeight());
} else {
return new Dimension(0, 0);
}
}
public void setIcon(Icon icon) {
this.icon = icon;
}
}
}