package org.chartsy.chatsy.chat.component.tabbedPane; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridLayout; import java.awt.Image; import java.awt.Insets; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.TexturePaint; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Arrays; import javax.imageio.ImageIO; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import org.chartsy.chatsy.chat.util.FontLoader; import org.chartsy.chatsy.chat.Workspace; import org.openide.util.ImageUtilities; /** * * @author Viorel */ public class TabbedPane extends JPanel { private final JComponent[] tabs; private final TabButton[] buttons; private final JComponent tabHeader; private final JPanel tabContent; private boolean[] tabAdded; private int selTabIndex = -1; public TabbedPane(JComponent... tabs) { super(new BorderLayout()); setOpaque(false); this.tabs = tabs; tabAdded = new boolean[tabs.length]; Arrays.fill(tabAdded, false); ActionListener al = new ActionListener() { public void actionPerformed(ActionEvent e) { TabButton btn = (TabButton) e.getSource(); btn.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); switchTab(btn.getTabIndex()); } }; buttons = new TabButton[tabs.length]; for (int i = 0; i < buttons.length; i++) { if (tabs[i] != null) { buttons[i] = new TabButton(tabs[i].getName(), i); buttons[i].addActionListener(al); } } tabHeader = new TabHeader(buttons); add(tabHeader, BorderLayout.NORTH); tabContent = new TabContentPane(); add(tabContent, BorderLayout.CENTER); switchTab(0); } private void switchTab(int tabIndex) { if (!tabAdded[tabIndex]) { tabContent.add(tabs[tabIndex], new GridBagConstraints(tabIndex, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0) ); tabAdded[tabIndex] = true; } if (selTabIndex >= 0) buttons[selTabIndex].setSelected(false); JComponent compToShow = tabs[tabIndex]; JComponent compToHide = selTabIndex >= 0 ? tabs[selTabIndex] : null; selTabIndex = tabIndex; buttons[selTabIndex].setSelected(true); if (compToHide != null) compToHide.setVisible(false); compToShow.setVisible(true); compToShow.requestFocusInWindow(); Workspace.getInstance().getCommandPanel().setSelectedTab(selTabIndex); } private static class TabButton extends JLabel { private boolean isSelected = false; private ActionListener actionListener; private final int tabIndex; private Image tabBackground; private Image tabSelectedBackground; public TabButton(String title, int index) { super(title); tabIndex = index; setOpaque(false); setHorizontalAlignment(JLabel.CENTER); setHorizontalTextPosition(JLabel.CENTER); setVerticalAlignment(JLabel.CENTER); setVerticalTextPosition(JLabel.CENTER); setFocusable(true); setFont(FontLoader.getDroidFont(Font.BOLD, 14)); setForeground(isSelected ? Color.decode("0x111111") : Color.decode("0xffffff")); addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_SPACE || e.getKeyCode() == KeyEvent.VK_ENTER) if (actionListener != null) actionListener.actionPerformed(new ActionEvent(TabButton.this, 0, "clicked")); } }); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (actionListener != null) actionListener.actionPerformed(new ActionEvent(TabButton.this, 0, "clicked")); } public void mouseEntered(MouseEvent e) { if (!isSelected) { setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } else { setCursor(Cursor.getDefaultCursor()); } } public void mouseExited(MouseEvent e) { setCursor(Cursor.getDefaultCursor()); } }); addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { // do something } public void focusLost(FocusEvent e) { // do something } }); tabBackground = ImageUtilities.loadImage("org/chartsy/chatsy/resources/tabh.png", true); tabSelectedBackground = ImageUtilities.loadImage("org/chartsy/chatsy/resources/tab.png", true); } public void addActionListener(ActionListener l) { assert null == actionListener; this.actionListener = l; } public void setSelected(boolean sel) { this.isSelected = sel; setForeground(isSelected ? Color.decode("0x111111") : Color.decode("0xffffff")); setFocusable(!sel); if (getParent() != null) getParent().repaint(); } public int getTabIndex() { return tabIndex; } public Dimension getPreferredSize() { final Dimension dimension = super.getPreferredSize(); if (dimension.width < 163) dimension.setSize(163, dimension.getHeight()); dimension.setSize(dimension.width, 30); return dimension; } protected void paintComponent(Graphics g) { Graphics2D graphics2D = (Graphics2D) g; graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); graphics2D.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); int width = getWidth(); if (isSelected) graphics2D.drawImage(tabSelectedBackground, width/2 - 82, 1, this); else graphics2D.drawImage(tabBackground, width/2 - 80, 1, this); super.paintComponent(graphics2D); } } private class TabHeader extends JPanel { private final TabButton[] buttons; private TexturePaint texturePaint; public TabHeader(TabButton ... buttons) { super(new GridLayout(1,0)); setOpaque(false); this.buttons = buttons; for (TabButton btn : buttons) add(btn); try { BufferedImage bufferedImage = ImageIO.read(getClass().getResource("/org/chartsy/chatsy/resources/tabsb.png")); Rectangle rectangle = new Rectangle(0, 0, bufferedImage.getWidth(null), bufferedImage.getHeight(null)); texturePaint = new TexturePaint(bufferedImage, rectangle); } catch (IOException ex) { } } protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D graphics2D = (Graphics2D) g; graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); graphics2D.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); graphics2D.setPaint(texturePaint); graphics2D.fill(new Rectangle(0, getHeight()-6, getWidth(), 6)); } public Dimension getPreferredSize() { Dimension dimension = super.getPreferredSize(); return new Dimension(dimension.width, 36); } } }