/* Copyright (C) 2006 Christian Schneider * * This file is part of Nomad. * * Nomad is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Nomad is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Nomad; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package net.sf.nmedit.nomad.core.swing.tabs; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.LayoutManager2; import java.beans.PropertyChangeListener; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.SingleSelectionModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import net.sf.nmedit.nmutils.Platform; public class JTabbedPane2 extends JComponent { /** * */ private static final long serialVersionUID = -2177154687789871416L; private JTabBar<Component> tabBar; public JTabbedPane2() { tabBar = new JTabBar<Component>(); super.setLayout(new TabbedPane2Layout(this)); add(tabBar, BorderLayout.NORTH); TabListener tabListener = new TabListener(this); tabListener.install(); setOpaque(true); } public JTabBar<Component> getTabBar() { return tabBar; } public void addAskRemoveListener(PropertyChangeListener l) { tabBar.addPropertyChangeListener("ask-remove", l); } public void removeAskRemoveListener(PropertyChangeListener l) { tabBar.removePropertyChangeListener("ask-remove", l); } private static class TabbedPane2Layout implements LayoutManager2 { private JTabbedPane2 tabbedPane; public TabbedPane2Layout(JTabbedPane2 tabbedPane) { this.tabbedPane = tabbedPane; } public Dimension maximumLayoutSize(Container target) { return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); } public void layoutContainer(Container parent) { Insets insets = parent.getInsets(); int w = tabbedPane.getWidth()-insets.left-insets.right; int h = tabbedPane.getHeight()-insets.top-insets.bottom; JTabBar<?> t = tabbedPane.tabBar; Dimension d = t.getPreferredSize(); if (t.getTabCount() == 0) { t.setBounds(insets.left, insets.top, 0, 0); d.setSize(0, 0); } else { t.setBounds(insets.left, insets.top, w, d.height); } Component c = tabbedPane.getSelectedComponent(); if (c != null) c.setBounds(insets.left, insets.top+d.height, w, Math.max(0, h-d.height)); } public Dimension minimumLayoutSize(Container parent) { synchronized (parent.getTreeLock()) { Dimension dim = new Dimension(0, 0); Component c = tabbedPane.getSelectedComponent(); if (c != null) { Dimension d = c.getMinimumSize(); dim.width=Math.max(dim.width, d.width); dim.height+=d.height; } c = tabbedPane.tabBar; if (c != null) { Dimension d = c.getMinimumSize(); dim.width=Math.max(dim.width, d.width); dim.height+=d.height; } Insets insets = parent.getInsets(); dim.width += insets.left + insets.right; dim.height += insets.top + insets.bottom; return dim; } } public Dimension preferredLayoutSize(Container parent) { synchronized (parent.getTreeLock()) { Dimension dim = new Dimension(0, 0); Component c = tabbedPane.getSelectedComponent(); if (c != null) { Dimension d = c.getPreferredSize(); dim.width=Math.max(dim.width, d.width); dim.height+=d.height; } c = tabbedPane.tabBar; if (c != null) { Dimension d = c.getPreferredSize(); dim.width=Math.max(dim.width, d.width); dim.height+=d.height; } Insets insets = parent.getInsets(); dim.width += insets.left + insets.right; dim.height += insets.top + insets.bottom; return dim; } } public void addLayoutComponent(String name, Component comp) { // no op } public void removeLayoutComponent(Component comp) { // no op } public void addLayoutComponent(Component comp, Object constraints) { // TODO Auto-generated method stub } public float getLayoutAlignmentX(Container target) { // TODO Auto-generated method stub return 0; } public float getLayoutAlignmentY(Container target) { // TODO Auto-generated method stub return 0; } public void invalidateLayout(Container target) { // TODO Auto-generated method stub } } protected void paintComponent(Graphics g) { if (getTabCount()>0) { Component selected = getSelectedComponent(); if (selected != null && selected.isOpaque()) return; } // TODO use UIDefaults if (Platform.isFlavor(Platform.OS.MacOSFlavor)) { g.setColor(Color.DARK_GRAY); } else { g.setColor(getBackground()); } g.fillRect(0, 0, getWidth(), getHeight()); } public void setLayout(LayoutManager mgr) { throw new UnsupportedOperationException("custom layout not supported"); } protected static class TabListener implements ChangeListener { protected JTabbedPane2 tp; protected Component currentComponent; public TabListener(JTabbedPane2 tp) { this.tp = tp; } public void install() { tp.addTabBarChangeListener(this); } public void stateChanged(ChangeEvent e) { Component c = tp.getSelectedComponent(); if (currentComponent == c) return; synchronized (tp.getTreeLock()) { if (currentComponent != null) { tp.remove(currentComponent); } currentComponent = c; if (currentComponent != null) { tp.add(currentComponent, BorderLayout.CENTER); } } tp.validate(); tp.revalidate(); tp.repaint(); } } public void addTabBarChangeListener(ChangeListener l) { tabBar.addChangeListener(l); } public void removeTabBarChangeListener(ChangeListener l) { tabBar.removeChangeListener(l); } public ChangeListener[] getTabBarChangeListeners() { return tabBar.getChangeListeners(); } public SingleSelectionModel getModel() { return tabBar.getModel(); } public void setModel(SingleSelectionModel model) { tabBar.setModel(model); } public int getSelectedIndex() { return tabBar.getSelectedIndex(); } public void setSelectedIndex(int index) { tabBar.setSelectedIndex(index); } public Component getSelectedComponent() { return tabBar.getSelectedItem(); } public void setSelectedComponent(Component c) { tabBar.setSelectedItem(c); } public void insertTab(String title, Icon icon, Component component, String tip, int index) { tabBar.insertTab(title, icon, component, tip, index); } public void addTab(String title, Icon icon, Component component, String tip) { insertTab(title, icon, component, tip, getTabCount()); } public void addTab(String title, Icon icon, Component component) { insertTab(title, icon, component, null, getTabCount()); } public void addTab(String title, Component component) { insertTab(title, null, component, null, getTabCount()); } public void removeTabAt(int index) { tabBar.removeTabAt(index); } public void removeAllTabs() { tabBar.setSelectedIndex(-1); int tabCount = getTabCount(); // We invoke removeTabAt for each tab, otherwise we may end up // removing Components added by the UI. while (tabCount-- > 0) { removeTabAt(tabCount); } } public int getTabCount() { return tabBar.getTabCount(); } // Getters for the Pages public String getTitleAt(int index) { return tabBar.getTitleAt(index); } public Icon getIconAt(int index) { return tabBar.getIconAt(index); } public Icon getDisabledIconAt(int index) { return tabBar.getDisabledIconAt(index); } public String getToolTipTextAt(int index) { return tabBar.getToolTipTextAt(index); } public boolean isEnabledAt(int index) { return tabBar.isEnabledAt(index); } public Component getComponentAt(int index) { return tabBar.getItemAt(index); } public int getMnemonicAt(int index) { return tabBar.getMnemonicAt(index); } public int getDisplayedMnemonicIndexAt(int index) { return tabBar.getDisplayedMnemonicIndexAt(index); } public void setTitleAt(int index, String title) { tabBar.setTitleAt(index, title); } public void setIconAt(int index, Icon icon) { tabBar.setIconAt(index, icon); } public void setDisabledIconAt(int index, Icon disabledIcon) { tabBar.setDisabledIconAt(index, disabledIcon); } public void setToolTipTextAt(int index, String toolTipText) { tabBar.setToolTipTextAt(index, toolTipText); } public void setEnabledAt(int index, boolean enabled) { tabBar.setEnabledAt(index, enabled); } public void setComponentAt(int index, Component component) { tabBar.setItemAt(index, component); } public void setDisplayedMnemonicIndexAt(int index, int mnemonicIndex) { tabBar.setDisplayedMnemonicIndexAt(index, mnemonicIndex); } public void setMnemonicAt(int index, int mnemonic) { tabBar.setMnemonicAt(index, mnemonic); } // end of Page setters public int indexOfTab(String title) { return tabBar.indexOfTab(title); } public int indexOfTab(Icon icon) { return tabBar.indexOfTab(icon); } public boolean containsComponent(Component component) { return tabBar.indexOfItem(component)>=0; } public int indexOfComponent(Component component) { return tabBar.indexOfItem(component); } public int indexAtLocation(int x, int y) { return tabBar.indexAtLocation(x, y); } public void setCloseActionEnabled(boolean enabled) { tabBar.setCloseActionEnabled(enabled); } public boolean isCloseActionEnabled() { return tabBar.isCloseActionEnabled(); } /* private JTabComponent tabBar; public JTabbedPane2() { this.tabBar = new JTabComponent(); JTabbedPane } public int getSelectedIndex() { return model.getSelectedIndex(); } public void setSelectedIndex(int index) { } public Component getSelectedComponent() { } public void setSelectedComponent(Component c) { } public void insertTab(String title, Icon icon, Component component, String tip, int index) { } public void addTab(String title, Icon icon, Component component, String tip) { } public void addTab(String title, Icon icon, Component component) { } public void addTab(String title, Component component) { } public Component add(Component component) { } public Component add(String title, Component component) { } public Component add(Component component, int index) { } public void removeTabAt(int index) { } public void remove(Component component) { } public void remove(int index) { removeTabAt(index); } public void removeAll() { } public int getTabCount() {} public String getTitleAt(int index) { } public Icon getIconAt(int index) { return ((Page)pages.elementAt(index)).icon; } public Icon getDisabledIconAt(int index) { } public String getToolTipTextAt(int index) { } public boolean isEnabledAt(int index) { } public Component getComponentAt(int index) { } public int getMnemonicAt(int tabIndex) { } public int getDisplayedMnemonicIndexAt(int tabIndex) { } public void setTitleAt(int index, String title) { } public void setIconAt(int index, Icon icon) { } public void setDisabledIconAt(int index, Icon disabledIcon) { } public void setToolTipTextAt(int index, String toolTipText) { } public void setEnabledAt(int index, boolean enabled) { } public void setComponentAt(int index, Component component) { } public void setDisplayedMnemonicIndexAt(int tabIndex, int mnemonicIndex) { } public void setMnemonicAt(int tabIndex, int mnemonic) { } public int indexOfTab(String title) { } public int indexOfTab(Icon icon) { } public int indexOfComponent(Component component) { } public String getToolTipText(MouseEvent event) { if (ui != null) { int index = ((TabbedPaneUI)ui).tabForCoordinate(this, event.getX(), event.getY()); if (index != -1) { return ((Page)pages.elementAt(index)).tip; } } return super.getToolTipText(event); } */ }