package uk.co.mmscomputing.util; import java.awt.Component; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTabbedPane; public class UtilTabCloseIcon implements Icon { private final Icon mIcon; private JTabbedPane mTabbedPane = null; private transient Rectangle mPosition = null; private boolean closed; /** * Creates a new instance of TabCloseIcon. */ public UtilTabCloseIcon( Icon icon ) { mIcon = icon; } /** * Creates a new instance of TabCloseIcon. */ public UtilTabCloseIcon() { // this( new ImageIcon( TabCloseIcon.class.getResource("CloseTab.png")) ); mIcon = new JarImageIcon( getClass(), "16x16/delete.png"); } /** * when painting, remember last position painted. */ public void paintIcon(Component c, Graphics g, int x, int y) { if( null==mTabbedPane ) { mTabbedPane = (JTabbedPane)c; mTabbedPane.addMouseListener( new MouseAdapter() { public void mouseReleased( MouseEvent e ) { // asking for isConsumed is *very* important, otherwise more than one tab might get closed! if ( !e.isConsumed() && mPosition.contains( e.getX(), e.getY() ) ) { if (closed == false) { if (JOptionPane.showConfirmDialog(new JFrame(), "Do you really want to discard this image ?", "Close", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION){ closed = true; final int index = mTabbedPane.getSelectedIndex(); mTabbedPane.remove( index ); e.consume(); } else { closed = false; } } } } }); } mPosition = new Rectangle( x,y, getIconWidth(), getIconHeight() ); mIcon.paintIcon(c, g, x, y ); } /** * just delegate */ public int getIconWidth() { return mIcon.getIconWidth(); } /** * just delegate */ public int getIconHeight() { return mIcon.getIconHeight(); } }