package net.sourceforge.squirrel_sql.client.gui.desktopcontainer.docktabdesktop; import javax.swing.*; import javax.swing.plaf.basic.BasicButtonUI; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; public class SmallTabButton<T> extends JButton { private Icon _icon; private T _userObject; public SmallTabButton(String toolTipText, ImageIcon icon) { this(toolTipText, icon, null); } public SmallTabButton(String toolTipText, ImageIcon icon, T userObject) { _icon = icon; _userObject = userObject; int size; if (null == icon) { size = 17; } else { size = Math.max(_icon.getIconWidth(), _icon.getIconHeight()) + 5; } setPreferredSize(new Dimension(size, size)); setToolTipText(toolTipText); //setIcon(icon); //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(s_buttonMouseListener); setRolloverEnabled(true); //Close the proper tab by clicking the button //addActionListener(this); setOpaque(false); } //we don't want to update UI for this button public void updateUI() { } private final static MouseListener s_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); } } }; protected void paintComponent(Graphics g) { super.paintComponent(g); if(null == _icon) { return; } Graphics2D g2 = (Graphics2D) g.create(); if (getModel().isPressed()) { g2.translate(1, 1); } int x = (getWidth() - _icon.getIconWidth()) / 2; int y = (getHeight() - _icon.getIconHeight()) / 2; g2.drawImage(iconToImage(_icon), x, y, null); g2.dispose(); } private Image iconToImage(Icon icon) { if(icon instanceof ImageIcon) { return ((ImageIcon) icon).getImage(); } else { BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); icon.paintIcon(null, image.getGraphics(), 0, 0); return image; } } @Override public void setIcon(Icon icon) { _icon = icon; repaint(); } public T getUserObject() { return _userObject; } public void setUserObject(T userObject) { _userObject = userObject; } }