| 1 7 8 package javax.swing; 9 10 import java.awt.*; 11 import java.awt.event.*; 12 import java.beans.*; 13 import java.util.*; 14 import javax.swing.event.*; 15 import javax.swing.plaf.*; 16 import javax.accessibility.*; 17 18 import java.io.Serializable ; 19 import java.io.ObjectOutputStream ; 20 import java.io.ObjectInputStream ; 21 import java.io.IOException ; 22 23 64 public class JTabbedPane extends JComponent 65 implements Serializable , Accessible, SwingConstants { 66 67 71 public static final int WRAP_TAB_LAYOUT = 0; 72 73 79 public static final int SCROLL_TAB_LAYOUT = 1; 80 81 82 86 private static final String uiClassID = "TabbedPaneUI"; 87 88 92 protected int tabPlacement = TOP; 93 94 private int tabLayoutPolicy; 95 96 97 protected SingleSelectionModel model; 98 99 private boolean haveRegistered; 100 101 105 protected ChangeListener changeListener = null; 106 107 Vector pages; 108 109 115 protected transient ChangeEvent changeEvent = null; 116 117 122 public JTabbedPane() { 123 this(TOP, WRAP_TAB_LAYOUT); 124 } 125 126 134 public JTabbedPane(int tabPlacement) { 135 this(tabPlacement, WRAP_TAB_LAYOUT); 136 } 137 138 153 public JTabbedPane(int tabPlacement, int tabLayoutPolicy) { 154 setTabPlacement(tabPlacement); 155 setTabLayoutPolicy(tabLayoutPolicy); 156 pages = new Vector(1); 157 setModel(new DefaultSingleSelectionModel ()); 158 updateUI(); 159 } 160 161 167 public TabbedPaneUI getUI() { 168 return (TabbedPaneUI)ui; 169 } 170 171 182 public void setUI(TabbedPaneUI ui) { 183 super.setUI(ui); 184 for (int i = 0; i < getTabCount(); i++) { 186 Icon icon = ((Page)pages.elementAt(i)).disabledIcon; 187 if (icon instanceof UIResource) { 188 setDisabledIconAt(i, null); 189 } 190 } 191 } 192 193 198 public void updateUI() { 199 setUI((TabbedPaneUI)UIManager.getUI(this)); 200 } 201 202 203 211 public String getUIClassID() { 212 return uiClassID; 213 } 214 215 216 220 protected class ModelListener implements ChangeListener, Serializable { 221 public void stateChanged(ChangeEvent e) { 222 fireStateChanged(); 223 } 224 } 225 226 233 protected ChangeListener createChangeListener() { 234 return new ModelListener(); 235 } 236 237 244 public void addChangeListener(ChangeListener l) { 245 listenerList.add(ChangeListener.class, l); 246 } 247 248 255 public void removeChangeListener(ChangeListener l) { 256 listenerList.remove(ChangeListener.class, l); 257 } 258 259 267 public ChangeListener[] getChangeListeners() { 268 return (ChangeListener[])listenerList.getListeners( 269 ChangeListener.class); 270 } 271 272 280 protected void fireStateChanged() { 281 Object [] listeners = listenerList.getListenerList(); 283 for (int i = listeners.length-2; i>=0; i-=2) { 286 if (listeners[i]==ChangeListener.class) { 287 if (changeEvent == null) 289 changeEvent = new ChangeEvent(this); 290 ((ChangeListener)listeners[i+1]).stateChanged(changeEvent); 291 } 292 } 293 } 294 295 300 public SingleSelectionModel getModel() { 301 return model; 302 } 303 304 313 public void setModel(SingleSelectionModel model) { 314 SingleSelectionModel oldModel = getModel(); 315 316 if (oldModel != null) { 317 oldModel.removeChangeListener(changeListener); 318 changeListener = null; 319 } 320 321 this.model = model; 322 323 if (model != null) { 324 changeListener = createChangeListener(); 325 model.addChangeListener(changeListener); 326 } 327 328 firePropertyChange("model", oldModel, model); 329 repaint(); 330 } 331 332 336 public int getTabPlacement() { 337 return tabPlacement; 338 } 339 340 365 public void setTabPlacement(int tabPlacement) { 366 if (tabPlacement != TOP && tabPlacement != LEFT && 367 tabPlacement != BOTTOM && tabPlacement != RIGHT) { 368 throw new IllegalArgumentException ("illegal tab placement: must be TOP, BOTTOM, LEFT, or RIGHT"); 369 } 370 if (this.tabPlacement != tabPlacement) { 371 int oldValue = this.tabPlacement; 372 this.tabPlacement = tabPlacement; 373 firePropertyChange("tabPlacement", oldValue, tabPlacement); 374 revalidate(); 375 repaint(); 376 } 377 } 378 379 385 public int getTabLayoutPolicy() { 386 return tabLayoutPolicy; 387 } 388 389 419 public void setTabLayoutPolicy(int tabLayoutPolicy) { 420 if (tabLayoutPolicy != WRAP_TAB_LAYOUT && tabLayoutPolicy != SCROLL_TAB_LAYOUT) { 421 throw new IllegalArgumentException ("illegal tab layout policy: must be WRAP_TAB_LAYOUT or SCROLL_TAB_LAYOUT"); 422 } 423 if (this.tabLayoutPolicy != tabLayoutPolicy) { 424 int oldValue = this.tabLayoutPolicy; 425 this.tabLayoutPolicy = tabLayoutPolicy; 426 firePropertyChange("tabLayoutPolicy", oldValue, tabLayoutPolicy); 427 revalidate(); 428 repaint(); 429 } 430 } 431 432 439 public int getSelectedIndex() { 440 return model.getSelectedIndex(); 441 } 442 443 460 public void setSelectedIndex(int index) { 461 if (index != -1) { 462 checkIndex(index); 463 } 464 setSelectedIndexImpl(index); 465 } 466 467 468 private void setSelectedIndexImpl(int index) { 469 int oldIndex = model.getSelectedIndex(); 470 Page oldPage = null, newPage = null; 471 if ((oldIndex >= 0) && (oldIndex != index)) { 472 oldPage = (Page) pages.elementAt(oldIndex); 473 } 474 if ((index >= 0) && (oldIndex != index)) { 475 newPage = (Page) pages.elementAt(index); 476 } 477 478 model.setSelectedIndex(index); 479 480 String oldName = null; 481 String newName = null; 482 483 if (oldPage != null) { 484 oldPage.firePropertyChange( 485 AccessibleContext.ACCESSIBLE_STATE_PROPERTY, 486 AccessibleState.SELECTED, null); 487 AccessibleContext ac = oldPage.getAccessibleContext(); 489 if (ac != null) { 490 oldName = ac.getAccessibleName(); 491 } 492 493 } 494 if (newPage != null) { 495 newPage.firePropertyChange( 496 AccessibleContext.ACCESSIBLE_STATE_PROPERTY, 497 null, AccessibleState.SELECTED); 498 AccessibleContext ac = newPage.getAccessibleContext(); 500 if (ac != null) { 501 newName = ac.getAccessibleName(); 502 } 503 504 } 505 506 if (newName != null) { 508 getAccessibleContext().firePropertyChange( 509 AccessibleContext.ACCESSIBLE_NAME_PROPERTY, oldName, newName); 510 } 511 512 } 513 514 521 public Component getSelectedComponent() { 522 int index = getSelectedIndex(); 523 if (index == -1) { 524 return null; 525 } 526 return getComponentAt(index); 527 } 528 529 541 public void setSelectedComponent(Component c) { 542 int index = indexOfComponent(c); 543 if (index != -1) { 544 setSelectedIndex(index); 545 } else { 546 throw new IllegalArgumentException ("component not found in tabbed pane"); 547 } 548 } 549 550 566 public void insertTab(String title, Icon icon, Component component, String tip, int index) { 567 int newIndex = index; 568 569 int removeIndex = indexOfComponent(component); 576 if (component != null && removeIndex != -1) { 577 removeTabAt(removeIndex); 578 if (newIndex > removeIndex) { 579 newIndex--; 580 } 581 } 582 583 int selectedIndex = getSelectedIndex(); 584 585 pages.insertElementAt(new Page(this, title != null? title : "", icon, null, 586 component, tip), newIndex); 587 588 589 if (component != null) { 590 addImpl(component, null, -1); 591 component.setVisible(false); 592 } 593 594 if (pages.size() == 1) { 595 setSelectedIndex(0); 596 } 597 598 if (selectedIndex >= newIndex) { 599 setSelectedIndex(selectedIndex + 1); 600 } 601 602 if (!haveRegistered && tip != null) { 603 ToolTipManager.sharedInstance().registerComponent(this); 604 haveRegistered = true; 605 } 606 607 if (accessibleContext != null) { 608 accessibleContext.firePropertyChange( 609 AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY, 610 null, component); 611 } 612 revalidate(); 613 repaint(); 614 } 615 616 630 public void addTab(String title, Icon icon, Component component, String tip) { 631 insertTab(title, icon, component, tip, pages.size()); 632 } 633 634 646 public void addTab(String title, Icon icon, Component component) { 647 insertTab(title, icon, component, null, pages.size()); 648 } 649 650 661 public void addTab(String title, Component component) { 662 insertTab(title, null, component, null, pages.size()); 663 } 664 665 677 public Component add(Component component) { 678 if (!(component instanceof UIResource)) { 679 addTab(component.getName(), component); 680 } else { 681 super.add(component); 682 } 683 return component; 684 } 685 686 697 public Component add(String title, Component component) { 698 if (!(component instanceof UIResource)) { 699 addTab(title, component); 700 } else { 701 super.add(title, component); 702 } 703 return component; 704 } 705 706 718 public Component add(Component component, int index) { 719 if (!(component instanceof UIResource)) { 720 insertTab(component.getName(), null, component, null, 723 index == -1? getTabCount() : index); 724 } else { 725 super.add(component, index); 726 } 727 return component; 728 } 729 730 743 public void add(Component component, Object constraints) { 744 if (!(component instanceof UIResource)) { 745 if (constraints instanceof String ) { 746 addTab((String )constraints, component); 747 } else if (constraints instanceof Icon ) { 748 addTab(null, (Icon )constraints, component); 749 } else { 750 add(component); 751 } 752 } else { 753 super.add(component, constraints); 754 } 755 } 756 757 771 public void add(Component component, Object constraints, int index) { 772 if (!(component instanceof UIResource)) { 773 774 Icon icon = constraints instanceof Icon ? (Icon )constraints : null; 775 String title = constraints instanceof String ? (String )constraints : null; 776 insertTab(title, icon, component, null, index == -1? getTabCount() : index); 779 } else { 780 super.add(component, constraints, index); 781 } 782 } 783 784 796 public void removeTabAt(int index) { 797 checkIndex(index); 798 799 int tabCount = getTabCount(); 803 int selected = getSelectedIndex(); 804 if (selected >= (tabCount - 1)) { 805 setSelectedIndexImpl(selected - 1); 806 } 807 808 Component component = getComponentAt(index); 809 810 if (accessibleContext != null) { 811 accessibleContext.firePropertyChange( 812 AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY, 813 component, null); 814 } 815 816 pages.removeElementAt(index); 817 818 putClientProperty("__index_to_remove__", new Integer (index)); 824 825 if (component != null) { 829 Component components[] = getComponents(); 830 for (int i = components.length; --i >= 0; ) { 831 if (components[i] == component) { 832 super.remove(i); 833 component.setVisible(true); 834 break; 835 } 836 } 837 } 838 839 revalidate(); 840 repaint(); 841 } 842 843 852 public void remove(Component component) { 853 int index = indexOfComponent(component); 854 if (index != -1) { 855 removeTabAt(index); 856 } else { 857 Component children[] = getComponents(); 860 for (int i=0; i < children.length; i++) { 861 if (component == children[i]) { 862 super.remove(i); 863 break; 864 } 865 } 866 } 867 } 868 869 879 public void remove(int index) { 880 removeTabAt(index); 881 } 882 883 890 public void removeAll() { 891 setSelectedIndexImpl(-1); 892 893 int tabCount = getTabCount(); 894 while (tabCount-- > 0) { 897 removeTabAt(tabCount); 898 } 899 } 900 901 906 public int getTabCount() { 907 return pages.size(); 908 } 909 910 921 public int getTabRunCount() { 922 if (ui != null) { 923 return ((TabbedPaneUI)ui).getTabRunCount(this); 924 } 925 return 0; 926 } 927 928 929 931 940 public String getTitleAt(int index) { 941 return ((Page)pages.elementAt(index)).title; 942 } 943 944 954 public Icon getIconAt(int index) { 955 return ((Page)pages.elementAt(index)).icon; 956 } 957 958 973 public Icon getDisabledIconAt(int index) { 974 Page page = ((Page)pages.elementAt(index)); 975 if (page.disabledIcon == null) { 976 page.disabledIcon = UIManager.getLookAndFeel().getDisabledIcon(this, page.icon); 977 } 978 return page.disabledIcon; 979 } 980 981 991 public String getToolTipTextAt(int index) { 992 return ((Page)pages.elementAt(index)).tip; 993 } 994 995 1006 public Color getBackgroundAt(int index) { 1007 return ((Page)pages.elementAt(index)).getBackground(); 1008 } 1009 1010 |