1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| /**
* Renderer d'onglet fermable.
*
* @author rom1v
*/
class CloseableTabComponent extends JPanel {
/** Pour la sérialisation. */
private static final long serialVersionUID = 1L;
/** Label pour le titre. */
private JLabel label;
/** Bouton de fermeture de l'onglet. */
private IconButton close;
/**
* Crée un renderer d'onglet fermable.
*
* @param title
* Titre de l'onglet.
* @param icon
* Icône de l'onglet.
* @param tip
* Tip de l'onglet.
*/
CloseableTabComponent(String title, Icon icon, String tip) {
super(new BorderLayout());
setOpaque(false);
/* Dispatcher des évènements souris sur le tableau à onglets. */
MouseListener dispatcher = new MouseListener() {
public void mouseClicked(MouseEvent e) {
dispatch(e);
}
public void mouseEntered(MouseEvent e) {
dispatch(e);
}
public void mouseExited(MouseEvent e) {
dispatch(e);
}
public void mousePressed(MouseEvent e) {
if(!(e.getComponent() instanceof AbstractButton))
dispatch(e);
}
public void mouseReleased(MouseEvent e) {
dispatch(e);
}
};
label = new JLabel(title, icon, SwingConstants.CENTER);
label.setToolTipText(tip);
label.setOpaque(false);
label.addMouseListener(dispatcher);
add(label);
JPanel east = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
east.add(Box.createHorizontalStrut(3));
east.setOpaque(false);
east.addMouseListener(dispatcher);
Icon normalIcon = ImageUtilities.toIcon(ImageManager.getImageManager().getImage("close_off", 12, 12));
Icon rolloverIcon = ImageUtilities.toIcon(ImageManager.getImageManager().getImage("close_on", 12, 12));
close = new IconButton(normalIcon, rolloverIcon);
close.setToolTipText("Ferme l'onglet");
close.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
/* Cette méthode est toujours exécutée dans l'EDT, donc pas besoin de synchronisation. */
/* On récupère l'index du renderer d'onglet dans le tableau à onglets. */
int index = indexOfTabComponent(CloseableTabComponent.this);
assert index >= 0 && index < getTabCount() : "L'index doit être cohérent.";
/* On signale aux écouteurs que l'onglet va être fermé. */
fireTabClosing(index);
/* On supprime l'onglet à cet index. */
removeTab(index);
// /* On signale aux écouteurs que l'onglet a été fermé. */
// fireTabClosed(index);
}
});
close.addMouseListener(dispatcher);
east.add(close);
add(east, BorderLayout.EAST);
addMouseListener(dispatcher);
}
}
/**
* Dispatche les évènements souris sur le tableau à onglets.
*
* @param e
* Évènement souris déclenché.
*/
private void dispatch(MouseEvent e) {
MouseEvent event = SwingUtilities.convertMouseEvent(e.getComponent(), e, ExtendedTabbedPane.this);
ExtendedTabbedPane.this.dispatchEvent(event);
} |