mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			1729 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			1729 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* JTabbedPane.java --
 | |
|    Copyright (C) 2002, 2004, 2005, 2006,  Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath 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, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath 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 GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package javax.swing;
 | |
| 
 | |
| import gnu.java.lang.CPStringBuilder;
 | |
| 
 | |
| import java.awt.Color;
 | |
| import java.awt.Component;
 | |
| import java.awt.Point;
 | |
| import java.awt.Rectangle;
 | |
| import java.awt.event.MouseEvent;
 | |
| import java.io.Serializable;
 | |
| import java.util.Locale;
 | |
| import java.util.Vector;
 | |
| 
 | |
| import javax.accessibility.Accessible;
 | |
| import javax.accessibility.AccessibleContext;
 | |
| import javax.accessibility.AccessibleRole;
 | |
| import javax.accessibility.AccessibleSelection;
 | |
| import javax.accessibility.AccessibleState;
 | |
| import javax.accessibility.AccessibleStateSet;
 | |
| import javax.swing.event.ChangeEvent;
 | |
| import javax.swing.event.ChangeListener;
 | |
| import javax.swing.plaf.TabbedPaneUI;
 | |
| import javax.swing.plaf.UIResource;
 | |
| 
 | |
| /**
 | |
|  * This is a container for components where only one component is displayed at
 | |
|  * a given time and the displayed component can be switched by clicking on
 | |
|  * tabs.
 | |
|  *
 | |
|  * <p>
 | |
|  * Tabs can be oriented in several ways. They can be above, below, left and
 | |
|  * right of the component. Tabs can either wrap around (by creating multiple
 | |
|  * rows of tabs) or they can be scrolled (where only a subset of the  tabs
 | |
|  * can be seen at once). More tabs can be added by calling the
 | |
|  * add/addTab/insertTab methods.
 | |
|  * </p>
 | |
|  */
 | |
| public class JTabbedPane extends JComponent implements Serializable,
 | |
|                                                        Accessible,
 | |
|                                                        SwingConstants
 | |
| {
 | |
|   /**
 | |
|    * Accessibility support for <code>JTabbedPane</code>.
 | |
|    */
 | |
|   protected class AccessibleJTabbedPane extends JComponent.AccessibleJComponent
 | |
|     implements AccessibleSelection, ChangeListener
 | |
|   {
 | |
|     /**
 | |
|      * The serialization UID.
 | |
|      */
 | |
|     private static final long serialVersionUID = 7610530885966830483L;
 | |
| 
 | |
|     /**
 | |
|      * Creates a new AccessibleJTabbedPane object.
 | |
|      */
 | |
|     public AccessibleJTabbedPane()
 | |
|     {
 | |
|       super();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Receives notification when the selection state of the
 | |
|      * <code>JTabbedPane</code> changes and fires appropriate property change
 | |
|      * events to interested listeners.
 | |
|      *
 | |
|      * @param e the change event describing the change
 | |
|      */
 | |
|     public void stateChanged(ChangeEvent e)
 | |
|     {
 | |
|       // I couldn't figure out what else should be done here.
 | |
|       Object source = e.getSource();
 | |
|       firePropertyChange(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY,
 | |
|                          null, source);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible role of the <code>JTabbedPane</code>, which is
 | |
|      * {@link AccessibleRole#PAGE_TAB_LIST}.
 | |
|      *
 | |
|      * @return the accessible role of the <code>JTabbedPane</code>
 | |
|      */
 | |
|     public AccessibleRole getAccessibleRole()
 | |
|     {
 | |
|       return AccessibleRole.PAGE_TAB_LIST;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the number of accessible child components of the
 | |
|      * <code>JTabbedPane</code>.
 | |
|      *
 | |
|      * @return the number of accessible child components of the
 | |
|      *         <code>JTabbedPane</code>
 | |
|      */
 | |
|     public int getAccessibleChildrenCount()
 | |
|     {
 | |
|       return getTabCount();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible child component at the specified index.
 | |
|      *
 | |
|      * @param i the index of the child component to fetch
 | |
|      *
 | |
|      * @return the accessible child component at the specified index
 | |
|      */
 | |
|     public Accessible getAccessibleChild(int i)
 | |
|     {
 | |
|       // Testing shows that the reference implementation returns instances
 | |
|       // of page here.
 | |
|       Accessible child = null;
 | |
|       if (i >= 0 && i < tabs.size())
 | |
|         child = (Page) tabs.get(i);
 | |
|       return child;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the current selection state of the <code>JTabbedPane</code>
 | |
|      * as AccessibleSelection object.
 | |
|      *
 | |
|      * @return the current selection state of the <code>JTabbedPane</code>
 | |
|      */
 | |
|     public AccessibleSelection getAccessibleSelection()
 | |
|     {
 | |
|       return this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible child component at the specified coordinates.
 | |
|      * If there is no child component at this location, then return the
 | |
|      * currently selected tab.
 | |
|      *
 | |
|      * @param p the coordinates at which to look up the child component
 | |
|      *
 | |
|      * @return the accessible child component at the specified coordinates or
 | |
|      *         the currently selected tab if there is no child component at
 | |
|      *         this location
 | |
|      */
 | |
|     public Accessible getAccessibleAt(Point p)
 | |
|     {
 | |
|       int tabIndex = indexAtLocation(p.x, p.y);
 | |
|       if (tabIndex >= 0)
 | |
|         return getAccessibleChild(tabIndex);
 | |
|       else
 | |
|         return getAccessibleSelection(0);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the number of selected child components of the
 | |
|      * <code>JTabbedPane</code>. The reference implementation appears
 | |
|      * to return <code>1</code> always and we do the same.
 | |
|      *
 | |
|      * @return <code>1</code>
 | |
|      */
 | |
|     public int getAccessibleSelectionCount()
 | |
|     {
 | |
|       return 1;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the selected tab, or <code>null</code> if there is no
 | |
|      * selection.
 | |
|      *
 | |
|      * @param i  the selection index (ignored here).
 | |
|      *
 | |
|      * @return The selected tab, or <code>null</code>.
 | |
|      */
 | |
|     public Accessible getAccessibleSelection(int i)
 | |
|     {
 | |
|       Accessible result = null;
 | |
|       int selected = getSelectedIndex();
 | |
|       if (selected >= 0)
 | |
|         result = (Page) tabs.get(selected);
 | |
|       return result;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns <code>true</code> if the specified child is selected,
 | |
|      * and <code>false</code> otherwise.
 | |
|      *
 | |
|      * @param i the child index.
 | |
|      *
 | |
|      * @return A boolean.
 | |
|      */
 | |
|     public boolean isAccessibleChildSelected(int i)
 | |
|     {
 | |
|       return i == getSelectedIndex();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Selects the specified tab.
 | |
|      *
 | |
|      * @param i  the index of the item to select.
 | |
|      */
 | |
|     public void addAccessibleSelection(int i)
 | |
|     {
 | |
|       setSelectedIndex(i);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Does nothing - it makes no sense to remove a selection for a
 | |
|      * tabbed pane, since one tab must always be selected.
 | |
|      *
 | |
|      * @param i  the item index.
 | |
|      *
 | |
|      * @see #addAccessibleSelection(int)
 | |
|      */
 | |
|     public void removeAccessibleSelection(int i)
 | |
|     {
 | |
|       // do nothing
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Does nothing - it makes no sense to clear the selection for
 | |
|      * a tabbed pane, since one tab must always be selected.
 | |
|      *
 | |
|      * @see #addAccessibleSelection(int)
 | |
|      */
 | |
|     public void clearAccessibleSelection()
 | |
|     {
 | |
|       // do nothing
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Does nothing - it makes no sense to select all for a tabbed
 | |
|      * pane, since only one tab can be selected at a time.
 | |
|      *
 | |
|      * @see #addAccessibleSelection(int)
 | |
|      */
 | |
|     public void selectAllAccessibleSelection()
 | |
|     {
 | |
|       // do nothing
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * A helper class that listens for changes to the model.
 | |
|    */
 | |
|   protected class ModelListener implements ChangeListener, Serializable
 | |
|   {
 | |
|     private static final long serialVersionUID = 497359819958114132L;
 | |
| 
 | |
|     /**
 | |
|      * Creates a new ModelListener object.
 | |
|      */
 | |
|     protected ModelListener()
 | |
|     {
 | |
|       // Nothing to do here.
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method is called whenever the model  is changed.
 | |
|      *
 | |
|      * @param e The ChangeEvent that is passed from the model.
 | |
|      */
 | |
|     public void stateChanged(ChangeEvent e)
 | |
|     {
 | |
|       // Propagate to our listeners.
 | |
|       fireStateChanged();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * A private class that holds all the information  for each tab.
 | |
|    */
 | |
|   private class Page
 | |
|     extends AccessibleContext
 | |
|     implements Accessible
 | |
|   {
 | |
|     /** The tooltip string. */
 | |
|     private String tip;
 | |
| 
 | |
|     /** The component associated with the tab. */
 | |
|     private Component component;
 | |
| 
 | |
|     /** The active icon associated with the tab. */
 | |
|     private transient Icon icon;
 | |
| 
 | |
|     /** The disabled icon associated with the tab. */
 | |
|     private transient Icon disabledIcon;
 | |
| 
 | |
|     /** The tab's enabled status. */
 | |
|     private transient boolean enabled = true;
 | |
| 
 | |
|     /** The string painted on the tab. */
 | |
|     private transient String title;
 | |
| 
 | |
|     /** The background color of the tab. */
 | |
|     private transient Color bg;
 | |
| 
 | |
|     /** The foreground color of the tab. */
 | |
|     private transient Color fg;
 | |
| 
 | |
|     /** The mnemonic associated with the tab. */
 | |
|     private transient int mnemonicKey;
 | |
| 
 | |
|     /** The index of the underlined character in the string. */
 | |
|     private transient int underlinedChar = -1;
 | |
| 
 | |
|     /**
 | |
|      * Creates a new data storage for the tab.
 | |
|      *
 | |
|      * @param title The string displayed on the tab.
 | |
|      * @param icon The active icon displayed on the tab.
 | |
|      * @param component The component associated with the tab.
 | |
|      * @param tip The tooltip associated with the tab.
 | |
|      */
 | |
|     protected Page(String title, Icon icon, Component component, String tip)
 | |
|     {
 | |
|       this.title = title;
 | |
|       this.icon = icon;
 | |
|       this.component = component;
 | |
|       this.tip = tip;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the component associated with the tab.
 | |
|      *
 | |
|      * @return The component associated with the tab.
 | |
|      */
 | |
|     public Component getComponent()
 | |
|     {
 | |
|       return component;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the component associated with the tab.
 | |
|      *
 | |
|      * @param c The component associated with the tab.
 | |
|      */
 | |
|     public void setComponent(Component c)
 | |
|     {
 | |
|       int i = indexOfComponent(component);
 | |
|       insertTab(title, icon, c, tip, i);
 | |
|       component = c;
 | |
|       removeTabAt(i);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the tooltip string.
 | |
|      *
 | |
|      * @return The tooltip string.
 | |
|      */
 | |
|     public String getTip()
 | |
|     {
 | |
|       return tip;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the tooltip string.
 | |
|      *
 | |
|      * @param tip The tooltip string.
 | |
|      */
 | |
|     public void setTip(String tip)
 | |
|     {
 | |
|       this.tip = tip;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the background color.
 | |
|      *
 | |
|      * @return The background color.
 | |
|      */
 | |
|     public Color getBackground()
 | |
|     {
 | |
|       Color background;
 | |
|       if (bg == null)
 | |
|         background = JTabbedPane.this.getBackground();
 | |
|       else
 | |
|         background = bg;
 | |
|       return background;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the background color.
 | |
|      *
 | |
|      * @param background The background color.
 | |
|      */
 | |
|     public void setBackground(Color background)
 | |
|     {
 | |
|       bg = background;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the foreground color.
 | |
|      *
 | |
|      * @return The foreground color.
 | |
|      */
 | |
|     public Color getForeground()
 | |
|     {
 | |
|       Color foreground;
 | |
|       if (fg == null)
 | |
|         foreground = JTabbedPane.this.getForeground();
 | |
|       else
 | |
|         foreground = fg;
 | |
|       return foreground;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the foreground color.
 | |
|      *
 | |
|      * @param foreground The foreground color.
 | |
|      */
 | |
|     public void setForeground(Color foreground)
 | |
|     {
 | |
|       fg = foreground;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the title associated with the tab.
 | |
|      *
 | |
|      * @return The title of the tab.
 | |
|      */
 | |
|     public String getTitle()
 | |
|     {
 | |
|       return title;
 | |
|     }
 | |
| 
 | |
|     private static final long serialVersionUID = 1614381073220130939L;
 | |
| 
 | |
|     /**
 | |
|      * This method sets the title of the tab.
 | |
|      *
 | |
|      * @param text The title of the tab.
 | |
|      */
 | |
|     public void setTitle(String text)
 | |
|     {
 | |
|       title = text;
 | |
|       if (title != null && title.length() <= underlinedChar)
 | |
|         setDisplayedMnemonicIndex(title.length() - 1);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the active icon.
 | |
|      *
 | |
|      * @return The active icon.
 | |
|      */
 | |
|     public Icon getIcon()
 | |
|     {
 | |
|       return icon;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the active icon.
 | |
|      *
 | |
|      * @param icon The active icon.
 | |
|      */
 | |
|     public void setIcon(Icon icon)
 | |
|     {
 | |
|       this.icon = icon;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the disabled icon.
 | |
|      *
 | |
|      * @return The disabled icon.
 | |
|      */
 | |
|     public Icon getDisabledIcon()
 | |
|     {
 | |
|       if (disabledIcon == null && icon instanceof ImageIcon)
 | |
|         setDisabledIcon(icon);
 | |
|       return disabledIcon;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the disabled icon.
 | |
|      *
 | |
|      * @param disabledIcon The disabled icon.
 | |
|      */
 | |
|     public void setDisabledIcon(Icon disabledIcon)
 | |
|     {
 | |
|       this.disabledIcon = disabledIcon;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns whether the tab is enabled.
 | |
|      *
 | |
|      * @return Whether the tab is enabled.
 | |
|      */
 | |
|     public boolean isEnabled()
 | |
|     {
 | |
|       return enabled;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets whether the tab is enabled.
 | |
|      *
 | |
|      * @param enabled Whether this tab is enabled.
 | |
|      */
 | |
|     public void setEnabled(boolean enabled)
 | |
|     {
 | |
|       this.enabled = enabled;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the mnemonic.
 | |
|      *
 | |
|      * @return The mnemonic.
 | |
|      */
 | |
|     public int getMnemonic()
 | |
|     {
 | |
|       return mnemonicKey;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the mnemonic. If the title is set, it will update the
 | |
|      * mnemonicIndex.
 | |
|      *
 | |
|      * @param key The mnemonic.
 | |
|      */
 | |
|     public void setMnemonic(int key)
 | |
|     {
 | |
|       setMnemonic((char) key);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the mnemonic. If the title is set, it will update the
 | |
|      * mnemonicIndex.
 | |
|      *
 | |
|      * @param aChar The mnemonic.
 | |
|      */
 | |
|     public void setMnemonic(char aChar)
 | |
|     {
 | |
|       mnemonicKey = aChar;
 | |
|       if (title != null)
 | |
|         setDisplayedMnemonicIndex(title.indexOf(mnemonicKey));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method returns the mnemonicIndex.
 | |
|      *
 | |
|      * @return The mnemonicIndex.
 | |
|      */
 | |
|     public int getDisplayedMnemonicIndex()
 | |
|     {
 | |
|       return underlinedChar;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * This method sets the mnemonicIndex.
 | |
|      *
 | |
|      * @param index The mnemonicIndex.
 | |
|      *
 | |
|      * @throws IllegalArgumentException If index less than -1 || index greater
 | |
|      *         or equal to title.length.
 | |
|      */
 | |
|     public void setDisplayedMnemonicIndex(int index)
 | |
|       throws IllegalArgumentException
 | |
|     {
 | |
|       if (index < -1 || title != null && index >= title.length())
 | |
|         throw new IllegalArgumentException();
 | |
| 
 | |
|       if (title == null || mnemonicKey == 0 || (index > -1 && title.charAt(index) != mnemonicKey))
 | |
|         index = -1;
 | |
| 
 | |
|       underlinedChar = index;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible context, which is this object itself.
 | |
|      *
 | |
|      * @return the accessible context, which is this object itself
 | |
|      */
 | |
|     public AccessibleContext getAccessibleContext()
 | |
|     {
 | |
|       return this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible name for this tab.
 | |
|      *
 | |
|      * @return The accessible name.
 | |
|      */
 | |
|     public String getAccessibleName()
 | |
|     {
 | |
|       if (accessibleName != null)
 | |
|         return accessibleName;
 | |
|       else
 | |
|         return title;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible role of this tab, which is always
 | |
|      * {@link AccessibleRole#PAGE_TAB}.
 | |
|      *
 | |
|      * @return the accessible role of this tab
 | |
|      */
 | |
|     public AccessibleRole getAccessibleRole()
 | |
|     {
 | |
|       return AccessibleRole.PAGE_TAB;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible state set of this object.
 | |
|      *
 | |
|      * @return the accessible state set of this object
 | |
|      */
 | |
|     public AccessibleStateSet getAccessibleStateSet()
 | |
|     {
 | |
|       AccessibleContext parentCtx = JTabbedPane.this.getAccessibleContext();
 | |
|       AccessibleStateSet state = parentCtx.getAccessibleStateSet();
 | |
|       state.add(AccessibleState.SELECTABLE);
 | |
|       if (component == getSelectedComponent())
 | |
|         state.add(AccessibleState.SELECTED);
 | |
|       return state;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the index of this tab inside its parent.
 | |
|      *
 | |
|      * @return the index of this tab inside its parent
 | |
|      */
 | |
|     public int getAccessibleIndexInParent()
 | |
|     {
 | |
|       // TODO: Not sure if the title is unambiguous, but I can't figure
 | |
|       // another way of doing this.
 | |
|       return indexOfTab(title);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the number of accessible children, which is always one (the
 | |
|      * component of this tab).
 | |
|      *
 | |
|      * @return the number of accessible children
 | |
|      */
 | |
|     public int getAccessibleChildrenCount()
 | |
|     {
 | |
|       return 1;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the accessible child of this tab, which is the component
 | |
|      * displayed by the tab.
 | |
|      *
 | |
|      * @return the accessible child of this tab
 | |
|      */
 | |
|     public Accessible getAccessibleChild(int i)
 | |
|     {
 | |
|       // A quick test shows that this method always returns the component
 | |
|       // displayed by the tab, regardless of the index.
 | |
|       return (Accessible) component;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the locale of this accessible object.
 | |
|      *
 | |
|      * @return the locale of this accessible object
 | |
|      */
 | |
|     public Locale getLocale()
 | |
|     {
 | |
|       // TODO: Is this ok?
 | |
|       return Locale.getDefault();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private static final long serialVersionUID = 1614381073220130939L;
 | |
| 
 | |
|   /** The changeEvent used to fire changes to listeners. */
 | |
|   protected ChangeEvent changeEvent;
 | |
| 
 | |
|   /** The listener that listens to the model. */
 | |
|   protected ChangeListener changeListener;
 | |
| 
 | |
|   /** The model that describes this JTabbedPane. */
 | |
|   protected SingleSelectionModel model;
 | |
| 
 | |
|   /** Indicates that the TabbedPane is in scrolling mode. */
 | |
|   public static final int SCROLL_TAB_LAYOUT = 1;
 | |
| 
 | |
|   /** Indicates that the TabbedPane is in wrap mode. */
 | |
|   public static final int WRAP_TAB_LAYOUT = 0;
 | |
| 
 | |
|   /** The current tabPlacement of the TabbedPane. */
 | |
|   protected int tabPlacement = SwingConstants.TOP;
 | |
| 
 | |
|   /** The current tabLayoutPolicy of the TabbedPane. */
 | |
|   private transient int layoutPolicy;
 | |
| 
 | |
|   /** The list of tabs associated with the TabbedPane. */
 | |
|   transient Vector tabs = new Vector();
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JTabbedPane object with tabs on top and using wrap tab
 | |
|    * layout.
 | |
|    */
 | |
|   public JTabbedPane()
 | |
|   {
 | |
|     this(SwingConstants.TOP, WRAP_TAB_LAYOUT);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JTabbedPane object using wrap tab layout  and the given
 | |
|    * <code>tabPlacement</code>, where <code>tabPlacement</code> can be one
 | |
|    * of the following values: {@link #TOP}, {@link #BOTTOM}, {@link #LEFT} or
 | |
|    * {@link #RIGHT}.
 | |
|    *
 | |
|    * @param tabPlacement where the tabs will be placed
 | |
|    */
 | |
|   public JTabbedPane(int tabPlacement)
 | |
|   {
 | |
|     this(tabPlacement, WRAP_TAB_LAYOUT);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Creates a new JTabbedPane object with the given <code>tabPlacement</code>
 | |
|    * and <code>tabLayoutPolicy</code>. The <code>tabPlacement</code> can be one
 | |
|    * of the following values: {@link #TOP}, {@link #BOTTOM}, {@link #LEFT} or
 | |
|    * {@link #RIGHT}. The <code>tabLayoutPolicy</code> can be either
 | |
|    * {@link #SCROLL_TAB_LAYOUT} or {@link #WRAP_TAB_LAYOUT}.
 | |
|    *
 | |
|    * @param tabPlacement where the tabs will be placed
 | |
|    * @param tabLayoutPolicy the way tabs will be placed
 | |
|    *
 | |
|    * @throws IllegalArgumentException If tabLayoutPolicy or tabPlacement are
 | |
|    *         not valid.
 | |
|    */
 | |
|   public JTabbedPane(int tabPlacement, int tabLayoutPolicy)
 | |
|   {
 | |
|     if (tabPlacement != TOP && tabPlacement != BOTTOM && tabPlacement != RIGHT
 | |
|         && tabPlacement != LEFT)
 | |
|       throw new IllegalArgumentException("tabPlacement is not valid.");
 | |
|     if (tabLayoutPolicy != SCROLL_TAB_LAYOUT
 | |
|         && tabLayoutPolicy != WRAP_TAB_LAYOUT)
 | |
|       throw new IllegalArgumentException("tabLayoutPolicy is not valid.");
 | |
|     this.tabPlacement = tabPlacement;
 | |
|     layoutPolicy = tabLayoutPolicy;
 | |
| 
 | |
|     setModel(new DefaultSingleSelectionModel());
 | |
| 
 | |
|     updateUI();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the UI used to display the JTabbedPane.
 | |
|    *
 | |
|    * @return The UI used to display the JTabbedPane.
 | |
|    */
 | |
|   public TabbedPaneUI getUI()
 | |
|   {
 | |
|     return (TabbedPaneUI) ui;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the UI used to display the JTabbedPane.
 | |
|    *
 | |
|    * @param ui The UI used to display the JTabbedPane.
 | |
|    */
 | |
|   public void setUI(TabbedPaneUI ui)
 | |
|   {
 | |
|     super.setUI(ui);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method restores the UI to the defaults given by the UIManager.
 | |
|    */
 | |
|   public void updateUI()
 | |
|   {
 | |
|     setUI((TabbedPaneUI) UIManager.getUI(this));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a string identifier that  is used to determine which
 | |
|    * UI will be used with  the JTabbedPane.
 | |
|    *
 | |
|    * @return A string identifier for the UI.
 | |
|    */
 | |
|   public String getUIClassID()
 | |
|   {
 | |
|     return "TabbedPaneUI";
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method creates a ChangeListener that is used to  listen to the model
 | |
|    * for events.
 | |
|    *
 | |
|    * @return A ChangeListener to listen to the model.
 | |
|    */
 | |
|   protected ChangeListener createChangeListener()
 | |
|   {
 | |
|     return new ModelListener();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a ChangeListener to the JTabbedPane.
 | |
|    *
 | |
|    * @param l The ChangeListener to add.
 | |
|    */
 | |
|   public void addChangeListener(ChangeListener l)
 | |
|   {
 | |
|     listenerList.add(ChangeListener.class, l);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method removes a ChangeListener to the JTabbedPane.
 | |
|    *
 | |
|    * @param l The ChangeListener to remove.
 | |
|    */
 | |
|   public void removeChangeListener(ChangeListener l)
 | |
|   {
 | |
|     listenerList.remove(ChangeListener.class, l);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method fires a ChangeEvent to all the JTabbedPane's ChangeListeners.
 | |
|    */
 | |
|   protected void fireStateChanged()
 | |
|   {
 | |
|     Object[] changeListeners = listenerList.getListenerList();
 | |
|     if (changeEvent == null)
 | |
|       changeEvent = new ChangeEvent(this);
 | |
|     for (int i = changeListeners.length - 2; i >= 0; i -= 2)
 | |
|       {
 | |
|         if (changeListeners[i] == ChangeListener.class)
 | |
|           ((ChangeListener) changeListeners[i + 1]).stateChanged(changeEvent);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns all ChangeListeners registered with the JTabbedPane.
 | |
|    *
 | |
|    * @return The ChangeListeners registered with the JTabbedPane.
 | |
|    */
 | |
|   public ChangeListener[] getChangeListeners()
 | |
|   {
 | |
|     return (ChangeListener[]) super.getListeners(ChangeListener.class);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the model used with the JTabbedPane.
 | |
|    *
 | |
|    * @return The JTabbedPane's model.
 | |
|    */
 | |
|   public SingleSelectionModel getModel()
 | |
|   {
 | |
|     return model;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method changes the model property of the JTabbedPane.
 | |
|    *
 | |
|    * @param m The new model to use with the JTabbedPane.
 | |
|    */
 | |
|   public void setModel(SingleSelectionModel m)
 | |
|   {
 | |
|     if (m != model)
 | |
|       {
 | |
|         SingleSelectionModel oldModel = this.model;
 | |
|         if (oldModel != null && changeListener != null)
 | |
|           oldModel.removeChangeListener(changeListener);
 | |
| 
 | |
|         model = m;
 | |
| 
 | |
|         if (model != null)
 | |
|           {
 | |
|             if (changeListener == null)
 | |
|               changeListener = createChangeListener();
 | |
|             model.addChangeListener(changeListener);
 | |
|           }
 | |
|         firePropertyChange("model", oldModel, this.model);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the tabPlacement.
 | |
|    *
 | |
|    * @return The tabPlacement used with the JTabbedPane.
 | |
|    */
 | |
|   public int getTabPlacement()
 | |
|   {
 | |
|     return tabPlacement;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method changes the tabPlacement property of the JTabbedPane.
 | |
|    *
 | |
|    * @param tabPlacement The tabPlacement to use.
 | |
|    *
 | |
|    * @throws IllegalArgumentException If tabPlacement is not one of TOP,
 | |
|    *         BOTTOM, LEFT, or RIGHT.
 | |
|    */
 | |
|   public void setTabPlacement(int tabPlacement)
 | |
|   {
 | |
|     if (tabPlacement != TOP && tabPlacement != BOTTOM && tabPlacement != RIGHT
 | |
|         && tabPlacement != LEFT)
 | |
|       throw new IllegalArgumentException("tabPlacement is not valid.");
 | |
|     if (tabPlacement != this.tabPlacement)
 | |
|       {
 | |
|         int oldPlacement = this.tabPlacement;
 | |
|         this.tabPlacement = tabPlacement;
 | |
|         firePropertyChange("tabPlacement", oldPlacement, this.tabPlacement);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the tabLayoutPolicy.
 | |
|    *
 | |
|    * @return The tabLayoutPolicy.
 | |
|    */
 | |
|   public int getTabLayoutPolicy()
 | |
|   {
 | |
|     return layoutPolicy;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method changes the tabLayoutPolicy property of the JTabbedPane.
 | |
|    *
 | |
|    * @param tabLayoutPolicy The tabLayoutPolicy to use.
 | |
|    *
 | |
|    * @throws IllegalArgumentException If tabLayoutPolicy is not one of
 | |
|    *         SCROLL_TAB_LAYOUT or WRAP_TAB_LAYOUT.
 | |
|    */
 | |
|   public void setTabLayoutPolicy(int tabLayoutPolicy)
 | |
|   {
 | |
|     if (tabLayoutPolicy != SCROLL_TAB_LAYOUT
 | |
|         && tabLayoutPolicy != WRAP_TAB_LAYOUT)
 | |
|       throw new IllegalArgumentException("tabLayoutPolicy is not valid.");
 | |
|     if (tabLayoutPolicy != layoutPolicy)
 | |
|       {
 | |
|         int oldPolicy = layoutPolicy;
 | |
|         layoutPolicy = tabLayoutPolicy;
 | |
|         firePropertyChange("tabLayoutPolicy", oldPolicy, layoutPolicy);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the index of the tab that is currently selected.
 | |
|    *
 | |
|    * @return The index of the selected tab.
 | |
|    */
 | |
|   public int getSelectedIndex()
 | |
|   {
 | |
|     return model.getSelectedIndex();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method checks the index.
 | |
|    *
 | |
|    * @param index The index to check.
 | |
|    * @param start DOCUMENT ME!
 | |
|    * @param end DOCUMENT ME!
 | |
|    *
 | |
|    * @throws IndexOutOfBoundsException DOCUMENT ME!
 | |
|    */
 | |
|   private void checkIndex(int index, int start, int end)
 | |
|   {
 | |
|     if (index < start || index >= end)
 | |
|       throw new IndexOutOfBoundsException("Index < " + start + " || Index >= "
 | |
|                                           + end);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the selected index. This method will hide the old
 | |
|    * component and show the new component.
 | |
|    *
 | |
|    * @param index The index to set it at.
 | |
|    */
 | |
|   public void setSelectedIndex(int index)
 | |
|   {
 | |
|     checkIndex(index, -1, tabs.size());
 | |
|     if (index != getSelectedIndex())
 | |
|       {
 | |
|         // Hiding and showing the involved components
 | |
|         // is done by the JTabbedPane's UI.
 | |
|         model.setSelectedIndex(index);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the component at the selected index.
 | |
|    *
 | |
|    * @return The component at the selected index.
 | |
|    */
 | |
|   public Component getSelectedComponent()
 | |
|   {
 | |
|     int selectedIndex = getSelectedIndex();
 | |
|     Component selected = null;
 | |
|     if (selectedIndex >= 0)
 | |
|       selected = getComponentAt(selectedIndex);
 | |
|     return selected;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the component at the selected index.
 | |
|    *
 | |
|    * @param c The component associated with the selected index.
 | |
|    */
 | |
|   public void setSelectedComponent(Component c)
 | |
|   {
 | |
|     if (c.getParent() == this)
 | |
|       setSelectedIndex(indexOfComponent(c));
 | |
|     else
 | |
|       setComponentAt(getSelectedIndex(), c);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method inserts tabs into JTabbedPane. This includes adding the
 | |
|    * component to the JTabbedPane and hiding it.
 | |
|    *
 | |
|    * @param title the title of the tab; may be <code>null</code>
 | |
|    * @param icon the tab's icon; may be <code>null</code>
 | |
|    * @param component the component associated with the tab
 | |
|    * @param tip the tooltip for the tab
 | |
|    * @param index the index to insert the tab at
 | |
|    */
 | |
|   public void insertTab(String title, Icon icon, Component component,
 | |
|                         String tip, int index)
 | |
|   {
 | |
|     if (title == null)
 | |
|       title = "";
 | |
|     Page p = new Page(title, icon, component, tip);
 | |
|     tabs.insertElementAt(p, index);
 | |
| 
 | |
|     // Hide the component so we don't see it. Do it before we parent it
 | |
|     // so we don't trigger a repaint.
 | |
|     if (component != null)
 | |
|       {
 | |
|         component.hide();
 | |
|         super.add(component);
 | |
|       }
 | |
| 
 | |
|     if (getSelectedIndex() == -1)
 | |
|       {
 | |
|         setSelectedIndex(0);
 | |
|         fireStateChanged();
 | |
|       }
 | |
| 
 | |
|     revalidate();
 | |
|     repaint();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a tab to the JTabbedPane.
 | |
|    *
 | |
|    * @param title the title of the tab; may be <code>null</code>
 | |
|    * @param icon the icon for the tab; may be <code>null</code>
 | |
|    * @param component the associated component
 | |
|    * @param tip the associated tooltip
 | |
|    */
 | |
|   public void addTab(String title, Icon icon, Component component, String tip)
 | |
|   {
 | |
|     insertTab(title, icon, component, tip, tabs.size());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a tab to the JTabbedPane.
 | |
|    *
 | |
|    * @param title the title of the tab; may be <code>null</code>
 | |
|    * @param icon the icon for the tab; may be <code>null</code>
 | |
|    * @param component the associated component
 | |
|    */
 | |
|   public void addTab(String title, Icon icon, Component component)
 | |
|   {
 | |
|     insertTab(title, icon, component, null, tabs.size());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a tab to the JTabbedPane.
 | |
|    *
 | |
|    * @param title the title of the tab; may be <code>null</code>
 | |
|    * @param component the associated component
 | |
|    */
 | |
|   public void addTab(String title, Component component)
 | |
|   {
 | |
|     insertTab(title, null, component, null, tabs.size());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a tab to the JTabbedPane. The title of the tab is the
 | |
|    * Component's name. If the Component is an instance of UIResource, it
 | |
|    * doesn't add the tab and instead add the component directly to the
 | |
|    * JTabbedPane.
 | |
|    *
 | |
|    * @param component The associated component.
 | |
|    *
 | |
|    * @return The Component that was added.
 | |
|    */
 | |
|   public Component add(Component component)
 | |
|   {
 | |
|     if (component instanceof UIResource)
 | |
|       super.add(component);
 | |
|     else
 | |
|       insertTab(component.getName(), null, component, null, tabs.size());
 | |
| 
 | |
|     return component;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a tab to the JTabbedPane. If the Component is an
 | |
|    * instance of UIResource, it doesn't add the tab and instead add the
 | |
|    * component directly to the JTabbedPane.
 | |
|    *
 | |
|    * @param title the title of the tab; may be <code>null</code>
 | |
|    * @param component the associated component
 | |
|    *
 | |
|    * @return The Component that was added.
 | |
|    */
 | |
|   public Component add(String title, Component component)
 | |
|   {
 | |
|     if (component instanceof UIResource)
 | |
|       super.add(component);
 | |
|     else
 | |
|       insertTab(title, null, component, null, tabs.size());
 | |
|     return component;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a tab to the JTabbedPane. If the Component is an
 | |
|    * instance of UIResource, it doesn't add the tab and instead add the
 | |
|    * component directly to the JTabbedPane.
 | |
|    *
 | |
|    * @param component The associated component.
 | |
|    * @param index The index to insert the tab at.
 | |
|    *
 | |
|    * @return The Component that was added.
 | |
|    */
 | |
|   public Component add(Component component, int index)
 | |
|   {
 | |
|     if (component instanceof UIResource)
 | |
|       super.add(component);
 | |
|     else
 | |
|       insertTab(component.getName(), null, component, null, index);
 | |
|     return component;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a tab to the JTabbedPane. If the Component is an
 | |
|    * instance of UIResource, it doesn't add the tab and instead add the
 | |
|    * component directly to the JTabbedPane. If the constraints object is an
 | |
|    * icon, it will be used as the tab's icon. If the constraints object is a
 | |
|    * string, we will use it as the title.
 | |
|    *
 | |
|    * @param component The associated component.
 | |
|    * @param constraints The constraints object.
 | |
|    */
 | |
|   public void add(Component component, Object constraints)
 | |
|   {
 | |
|     add(component, constraints, tabs.size());
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method adds a tab to the JTabbedPane. If the Component is an
 | |
|    * instance of UIResource, it doesn't add the tab and instead add the
 | |
|    * component directly to the JTabbedPane. If the constraints object is an
 | |
|    * icon, it will be used as the tab's icon. If the constraints object is a
 | |
|    * string, we will use it as the title.
 | |
|    *
 | |
|    * @param component The associated component.
 | |
|    * @param constraints The constraints object.
 | |
|    * @param index The index to insert the tab at.
 | |
|    */
 | |
|   public void add(Component component, Object constraints, int index)
 | |
|   {
 | |
|     if (component instanceof UIResource)
 | |
|       super.add(component);
 | |
|     else
 | |
|       {
 | |
|         if (constraints instanceof String)
 | |
|           insertTab((String) constraints, null, component, null, index);
 | |
|         else
 | |
|           insertTab(component.getName(),
 | |
|                     (constraints instanceof Icon) ? (Icon) constraints : null,
 | |
|                     component, null, index);
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Removes the tab at index. After the component associated with
 | |
|    * index is removed, its visibility is reset to true to ensure it
 | |
|    * will be visible if added to other containers.
 | |
|    *
 | |
|    * @param index The index of the tab to remove.
 | |
|    */
 | |
|   public void removeTabAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
| 
 | |
|     // We need to adjust the selection if we remove a tab that comes
 | |
|     // before the selected tab or if the selected tab is removed.
 | |
|     // This decrements the selected index by 1 if any of this is the case.
 | |
|     // Note that this covers all cases:
 | |
|     // - When the selected tab comes after the removed tab, this simply
 | |
|     //   adjusts the selection so that after the removal the selected tab
 | |
|     //   is still the same.
 | |
|     // - When we remove the currently selected tab, then the tab before the
 | |
|     //   selected tab gets selected.
 | |
|     // - When the last tab is removed, then we have an index==0, which gets
 | |
|     //   decremented to -1, which means no selection, which is 100% perfect.
 | |
|     int selectedIndex = getSelectedIndex();
 | |
|     if (selectedIndex >= index)
 | |
|       setSelectedIndex(selectedIndex - 1);
 | |
| 
 | |
|     Component comp = getComponentAt(index);
 | |
| 
 | |
|     // Remove the tab object.
 | |
|     tabs.remove(index);
 | |
| 
 | |
|     // Remove the component. I think we cannot assume that the tab order
 | |
|     // is equal to the component order, so we iterate over the children
 | |
|     // here to find the and remove the correct component.
 | |
|     if (comp != null)
 | |
|       {
 | |
|         Component[] children = getComponents();
 | |
|         for (int i = children.length - 1; i >= 0; --i)
 | |
|           {
 | |
|             if (children[i] == comp)
 | |
|               {
 | |
|                 super.remove(i);
 | |
|                 comp.setVisible(true);
 | |
|                 break;
 | |
|               }
 | |
|           }
 | |
|       }
 | |
|     revalidate();
 | |
|     repaint();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Removes the specified Component from the JTabbedPane.
 | |
|    *
 | |
|    * @param component The Component to remove.
 | |
|    */
 | |
|   public void remove(Component component)
 | |
|   {
 | |
|     // Since components implementing UIResource
 | |
|     // are not added as regular tabs by the add()
 | |
|     // methods we have to take special care when
 | |
|     // removing these object. Especially
 | |
|     // Container.remove(Component) cannot be used
 | |
|     // because it will call JTabbedPane.remove(int)
 | |
|     // later which is overridden and can only
 | |
|     // handle tab components.
 | |
|     // This implementation can even cope with a
 | |
|     // situation that someone called insertTab()
 | |
|     // with a component that implements UIResource.
 | |
|     int index = indexOfComponent(component);
 | |
| 
 | |
|     // If the component is not a tab component
 | |
|     // find out its Container-given index
 | |
|     // and call that class' implementation
 | |
|     // directly.
 | |
|     if (index == -1)
 | |
|       {
 | |
|         Component[] cs = getComponents();
 | |
|         for (int i = 0; i< cs.length; i++)
 | |
|           if (cs[i] == component)
 | |
|             super.remove(i);
 | |
|       }
 | |
|     else
 | |
|       removeTabAt(index);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Removes the tab and component which corresponds to the specified index.
 | |
|    *
 | |
|    * @param index The index of the tab to remove.
 | |
|    */
 | |
|   public void remove(int index)
 | |
|   {
 | |
|     removeTabAt(index);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method removes all tabs and associated components from the
 | |
|    * JTabbedPane.
 | |
|    */
 | |
|   public void removeAll()
 | |
|   {
 | |
|     setSelectedIndex(-1);
 | |
|     for (int i = getTabCount() - 1; i >= 0; i--)
 | |
|       removeTabAt(i);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns how many tabs are in the JTabbedPane.
 | |
|    *
 | |
|    * @return The number of tabs in the JTabbedPane.
 | |
|    */
 | |
|   public int getTabCount()
 | |
|   {
 | |
|     return tabs.size();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the number of runs used  to paint the JTabbedPane.
 | |
|    *
 | |
|    * @return The number of runs.
 | |
|    */
 | |
|   public int getTabRunCount()
 | |
|   {
 | |
|     return ((TabbedPaneUI) ui).getTabRunCount(this);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the tab title given the index.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return The title for the tab.
 | |
|    */
 | |
|   public String getTitleAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(index)).getTitle();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the active icon given the index.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return The active icon for the tab.
 | |
|    */
 | |
|   public Icon getIconAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(index)).getIcon();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the disabled icon given the index.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return The disabled icon for the tab.
 | |
|    */
 | |
|   public Icon getDisabledIconAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(index)).getDisabledIcon();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the tooltip string for the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return The tooltip string for the tab.
 | |
|    */
 | |
|   public String getToolTipTextAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(index)).getTip();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the foreground color for the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return The foreground color for the tab.
 | |
|    */
 | |
|   public Color getForegroundAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(index)).getForeground();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the background color for the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return The background color for the tab.
 | |
|    */
 | |
|   public Color getBackgroundAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(index)).getBackground();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the component associated with the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return The component associated with the tab.
 | |
|    */
 | |
|   public Component getComponentAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(index)).getComponent();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns whether this tab is enabled. Disabled tabs cannot be
 | |
|    * selected.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return Whether the tab is enabled.
 | |
|    */
 | |
|   public boolean isEnabledAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(index)).isEnabled();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the mnemonic for the tab.
 | |
|    *
 | |
|    * @param tabIndex The index of the tab.
 | |
|    *
 | |
|    * @return The mnemonic for the tab.
 | |
|    */
 | |
|   public int getMnemonicAt(int tabIndex)
 | |
|   {
 | |
|     checkIndex(tabIndex, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(tabIndex)).getMnemonic();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the mnemonic index for the tab.
 | |
|    *
 | |
|    * @param tabIndex The index of the tab.
 | |
|    *
 | |
|    * @return The mnemonic index for the tab.
 | |
|    */
 | |
|   public int getDisplayedMnemonicIndexAt(int tabIndex)
 | |
|   {
 | |
|     checkIndex(tabIndex, 0, tabs.size());
 | |
|     return ((Page) tabs.elementAt(tabIndex)).getDisplayedMnemonicIndex();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the bounds of the tab given the index.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    *
 | |
|    * @return A rectangle describing the bounds of the tab.
 | |
|    */
 | |
|   public Rectangle getBoundsAt(int index)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     return ((TabbedPaneUI) ui).getTabBounds(this, index);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the title of the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    * @param title The new title.
 | |
|    */
 | |
|   public void setTitleAt(int index, String title)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(index)).setTitle(title);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the icon of the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    * @param icon The new icon.
 | |
|    */
 | |
|   public void setIconAt(int index, Icon icon)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(index)).setIcon(icon);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the disabled icon of the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    * @param disabledIcon The new disabled icon.
 | |
|    */
 | |
|   public void setDisabledIconAt(int index, Icon disabledIcon)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(index)).setDisabledIcon(disabledIcon);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the tooltip text of the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    * @param toolTipText The tooltip text.
 | |
|    */
 | |
|   public void setToolTipTextAt(int index, String toolTipText)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(index)).setTip(toolTipText);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the background color of the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    * @param background The background color of the tab.
 | |
|    */
 | |
|   public void setBackgroundAt(int index, Color background)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(index)).setBackground(background);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the foreground color of the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    * @param foreground The foreground color of the tab.
 | |
|    */
 | |
|   public void setForegroundAt(int index, Color foreground)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(index)).setForeground(foreground);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets whether the tab is enabled.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    * @param enabled Whether the tab is enabled.
 | |
|    */
 | |
|   public void setEnabledAt(int index, boolean enabled)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(index)).setEnabled(enabled);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the component associated with the tab.
 | |
|    *
 | |
|    * @param index The index of the tab.
 | |
|    * @param component The component associated with the tab.
 | |
|    */
 | |
|   public void setComponentAt(int index, Component component)
 | |
|   {
 | |
|     checkIndex(index, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(index)).setComponent(component);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the displayed mnemonic index of the tab.
 | |
|    *
 | |
|    * @param tabIndex The index of the tab.
 | |
|    * @param mnemonicIndex The mnemonic index.
 | |
|    */
 | |
|   public void setDisplayedMnemonicIndexAt(int tabIndex, int mnemonicIndex)
 | |
|   {
 | |
|     checkIndex(tabIndex, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(tabIndex)).setDisplayedMnemonicIndex(mnemonicIndex);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method sets the mnemonic for the tab.
 | |
|    *
 | |
|    * @param tabIndex The index of the tab.
 | |
|    * @param mnemonic The mnemonic.
 | |
|    */
 | |
|   public void setMnemonicAt(int tabIndex, int mnemonic)
 | |
|   {
 | |
|     checkIndex(tabIndex, 0, tabs.size());
 | |
|     ((Page) tabs.elementAt(tabIndex)).setMnemonic(mnemonic);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method finds the index of a tab given the title.
 | |
|    *
 | |
|    * @param title The title that belongs to a tab.
 | |
|    *
 | |
|    * @return The index of the tab that has the title or -1 if not found.
 | |
|    */
 | |
|   public int indexOfTab(String title)
 | |
|   {
 | |
|     int index = -1;
 | |
|     for (int i = 0; i < tabs.size(); i++)
 | |
|       {
 | |
|         if (((Page) tabs.elementAt(i)).getTitle().equals(title))
 | |
|           {
 | |
|             index = i;
 | |
|             break;
 | |
|           }
 | |
|       }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method finds the index of a tab given the icon.
 | |
|    *
 | |
|    * @param icon The icon that belongs to a tab.
 | |
|    *
 | |
|    * @return The index of the tab that has the icon or -1 if not found.
 | |
|    */
 | |
|   public int indexOfTab(Icon icon)
 | |
|   {
 | |
|     int index = -1;
 | |
|     for (int i = 0; i < tabs.size(); i++)
 | |
|       {
 | |
|         if (((Page) tabs.elementAt(i)).getIcon() == icon)
 | |
|           {
 | |
|             index = i;
 | |
|             break;
 | |
|           }
 | |
|       }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method finds the index of a tab given the component.
 | |
|    *
 | |
|    * @param component A component associated with a tab.
 | |
|    *
 | |
|    * @return The index of the tab that has this component or -1 if not found.
 | |
|    */
 | |
|   public int indexOfComponent(Component component)
 | |
|   {
 | |
|     int index = -1;
 | |
|     for (int i = 0; i < tabs.size(); i++)
 | |
|       {
 | |
|         if (((Page) tabs.elementAt(i)).getComponent() == component)
 | |
|           {
 | |
|             index = i;
 | |
|             break;
 | |
|           }
 | |
|       }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns a tab index given an (x,y) location. The origin of
 | |
|    * the (x,y) pair will be the JTabbedPane's top left position. The  tab
 | |
|    * returned will be the one that contains the point. This method is
 | |
|    * delegated to the UI.
 | |
|    *
 | |
|    * @param x The x coordinate of the point.
 | |
|    * @param y The y coordinate of the point.
 | |
|    *
 | |
|    * @return The index of the tab that contains the point.
 | |
|    */
 | |
|   public int indexAtLocation(int x, int y)
 | |
|   {
 | |
|     return ((TabbedPaneUI) ui).tabForCoordinate(this, x, y);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * This method returns the tooltip text given a mouse event.
 | |
|    *
 | |
|    * @param event The mouse event.
 | |
|    *
 | |
|    * @return The tool tip text that is associated with this mouse event.
 | |
|    */
 | |
|   public String getToolTipText(MouseEvent event)
 | |
|   {
 | |
|     int index = indexAtLocation(event.getX(), event.getY());
 | |
|     return ((Page) tabs.elementAt(index)).getTip();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns a string describing the attributes for the
 | |
|    * <code>JTabbedPane</code> component, for use in debugging.  The return
 | |
|    * value is guaranteed to be non-<code>null</code>, but the format of the
 | |
|    * string may vary between implementations.
 | |
|    *
 | |
|    * @return A string describing the attributes of the
 | |
|    *     <code>JTabbedPane</code>.
 | |
|    */
 | |
|   protected String paramString()
 | |
|   {
 | |
|     CPStringBuilder sb = new CPStringBuilder(super.paramString());
 | |
|     sb.append(",tabPlacement=");
 | |
|     if (tabPlacement == TOP)
 | |
|       sb.append("TOP");
 | |
|     if (tabPlacement == BOTTOM)
 | |
|       sb.append("BOTTOM");
 | |
|     if (tabPlacement == LEFT)
 | |
|       sb.append("LEFT");
 | |
|     if (tabPlacement == RIGHT)
 | |
|       sb.append("RIGHT");
 | |
|     return sb.toString();
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the object that provides accessibility features for this
 | |
|    * <code>JTabbedPane</code> component.
 | |
|    *
 | |
|    * @return The accessible context (an instance of
 | |
|    *         {@link AccessibleJTabbedPane}).
 | |
|    */
 | |
|   public AccessibleContext getAccessibleContext()
 | |
|   {
 | |
|     if (accessibleContext == null)
 | |
|       {
 | |
|         AccessibleJTabbedPane ctx = new AccessibleJTabbedPane();
 | |
|         addChangeListener(ctx);
 | |
|         accessibleContext = ctx;
 | |
|       }
 | |
| 
 | |
|     return accessibleContext;
 | |
|   }
 | |
| }
 |