8sa1-gcc/libjava/javax/swing/plaf/basic/BasicTabbedPaneUI.java
Graydon Hoare d933abbe01 [multiple changes]
2005-02-15  Mark Wielaard  <mark@klomp.org>

	* java/awt/BasicStroke.java (hashCode): Check for null dash.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/peer/gtk/GtkArg.java,
	gnu/java/awt/peer/gtk/GtkArgList.java:
	Removed.

2005-02-15  Craig Black  <craig.black@aonix.com>

	* gnu/java/awt/peer/gtk/GtkCheckboxMenuItem.java
	(postMenuActionEvent): Implement to notify ItemListeners.
	* java/awt/CheckboxMenuItem.java
	(dispatchEventImpl): Update state on ItemEvent.
	* java/awt/MenuItem.java
	(processActionEvent): Retarget event source.

2005-02-15  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* gnu/java/awt/color/ClutProfileConverter.java,
	gnu/java/awt/peer/ClasspathTextLayoutPeer.java,
	gnu/java/awt/peer/gtk/GdkFontPeer.java,
	gnu/java/awt/peer/gtk/GdkGlyphVector.java,
	gnu/java/awt/peer/gtk/GdkGraphics2D.java,
	gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java,
	gnu/java/awt/peer/gtk/GdkPixbufDecoder.java,
	gnu/java/awt/peer/gtk/GdkRobotPeer.java,
	gnu/java/awt/peer/gtk/GdkTextLayout.java,
	gnu/java/awt/peer/gtk/GtkButtonPeer.java,
	gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,
	gnu/java/awt/peer/gtk/GtkChoicePeer.java,
	gnu/java/awt/peer/gtk/GtkComponentPeer.java,
	gnu/java/awt/peer/gtk/GtkContainerPeer.java,
	gnu/java/awt/peer/gtk/GtkDialogPeer.java,
	gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,
	gnu/java/awt/peer/gtk/GtkFontPeer.java,
	gnu/java/awt/peer/gtk/GtkFramePeer.java,
	gnu/java/awt/peer/gtk/GtkLabelPeer.java,
	gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java,
	gnu/java/awt/peer/gtk/GtkMenuItemPeer.java,
	gnu/java/awt/peer/gtk/GtkScrollPanePeer.java,
	gnu/java/awt/peer/gtk/GtkTextComponentPeer.java,
	gnu/java/awt/peer/gtk/GtkToolkit.java,
	gnu/java/awt/peer/gtk/GtkWindowPeer.java,
	javax/swing/JPopupMenu.java,
	javax/swing/JSpinner.java,
	javax/swing/SortingFocusTraversalPolicy.java,
	javax/swing/SwingUtilities.java,
	javax/swing/plaf/basic/BasicComboBoxEditor.java,
	javax/swing/plaf/basic/BasicComboBoxRenderer.java,
	javax/swing/tree/DefaultMutableTreeNode.java:
	Removed unused imports and expanded starred
	imports.

2005-02-15  Mark Wielaard  <mark@klomp.org>

	* java/awt/AWTKeyStroke.java (getAWTKeyStroke(String)): Throw
	IllegalArgumentException when the given String is null.

	* javax/swing/KeyStroke.java (getKeyStroke(String)): Return null
	when given keystoke sequence cannot be parsed.

	* javax/swing/JRootPane.java (setJMenuBar): Remove current menubar
	if one is installed. Only install the given menubar is not null.

	* javax/swing/JViewport.java (getViewSize): Return an empty
	Dimension when the view isn't set or preferred component size when
	no viewSize is set.

	* javax/swing/ViewportLayout.java (preferredLayoutSize): Return an
	empty Dimension when there is no view set.
	(minimumLayoutSize): Likewise.
	(layoutContainer): Don't try to layout when there is no view.

2005-02-15  Anthony Green  <green@redhat.com>

	* jni/gtk-peer/gtk_jawt.c (classpath_jawt_get_drawable,
	classpath_jawt_lock, classpath_jawt_unlock): New functions.
	* jawt.c (_Jv_JAWT_Lock, _Jv_JAWT_Unlock): New functions.
	(_Jv_GetDrawingSurface): Set visualID.
	(_Jv_FreeDrawingSurfaceInfo): Clear visualID.
	(JAWT_GetAWT): Set Lock and Unlock.
	* include/jawt_md.h (struct _JAWT_X11DrawingSurfaceInfo): Add visualID.
	* include/jawt.h (JAWT_VERSION_1_4, JAWT_LOCK_ERROR,
	JAWT_LOCK_CLIP_CHANGED, JAWT_LOCK_BOUNDS_CHANGED,
	JAWT_LOCK_SURFACE_CHANGED): New macros.
	(struct _JAWT): Add Lock and Unlock.

2005-02-15  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* jawt.c: New file.
	* include/jawt.h: Likewise.
	* include/jawt_md.h: Likewise.
	* include/Makefile.am (tool_include__HEADERS): Add jawt.h and
	jawt_md.h files.
	* jni/classpath/classpath_jawt.h: Likewise.
	* jni/gtk-peer/gtk_jawt.c: Likewise.
	* Makefile.am: Build libjawt.so.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/peer/gtk/GdkGraphics2D.java:
	Merged file header with classpath CVS head.
	* gnu/java/awt/peer/gtk/GdkPixbufDecoder.java:
	Merged code formatting with classpath CVS head.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c:
	Removed debug code.
	(Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector):
	Handle special JNI strings with 2 '\0' at the end.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c:
	Merged file header with classpath CVS head.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c:
	Merged code formatting with classpath CVS head.

2005-02-15  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c (create):
	Use GTK's built-in file system backend.  Use GTK_RESPONSE_ACCEPT.
	(handle_response): Use GTK_RESPONSE_ACCEPT.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* Makefile.am: Fix library build breakage.
	* Makefile.in: Regenerate.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTabbedPane.java
	(Page.setDisplayedMnemonicIndex): Handle empty menmonic.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/tree/DefaultMutableTreeNode.java:
	Reworked Javadocs all over.
	(getPathToRoot): Fixed direction of result array initialization.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c:
	 Fix includes for cairo 0.3.0 snappshot.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c:
	Merged file header from classpath CVS HEAD.

2005-02-15  Craig Black  <craig.black@aonix.com>

	* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
	(copyState): Pass a JNI global reference to signal handler.
	(realize_cb): Use and free JNI global reference.
	* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
	(create): Pass a JNI global reference to signal handler.
	(selection_changed): Match declaration.
	* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c
	(dispose): Do not remove entries from state tables until after widget is
	destroyed.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/Container.javai (paramString):
	If layoutMgr is null just return result of super.paramString().
	* java/awt/Scrollbar.java: Reformatted.
	* java/awt/im/InputContext.java (static):
	Removed redundant initializations.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/ImageIcon.java,
	javax/swing/UIManager.java,
	javax/swing/text/EditorKit.java,
	javax/swing/text/Segment.java:
	More whitespace cleanups.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/EmbeddedWindow.java,
	gnu/java/awt/image/ImageDecoder.java,
	gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,
	java/awt/DefaultKeyboardFocusManager.java,
	java/awt/Frame.java,
	java/awt/image/RGBImageFilter.java,
	javax/swing/AbstractButton.java,
	javax/swing/ActionMap.java,
	javax/swing/ComponentInputMap.java,
	javax/swing/DefaultDesktopManager.java,
	javax/swing/ImageIcon.java,
	javax/swing/InputMap.java,
	javax/swing/JButton.java,
	javax/swing/JCheckBox.java,
	javax/swing/JCheckBoxMenuItem.java,
	javax/swing/JEditorPane.java,
	javax/swing/JMenu.java,
	javax/swing/JMenuItem.java,
	javax/swing/JOptionPane.java,
	javax/swing/JRootPane.java,
	javax/swing/JTable.java,
	javax/swing/MenuSelectionManager.java,
	javax/swing/RepaintManager.java,
	javax/swing/ScrollPaneLayout.java,
	javax/swing/SortingFocusTraversalPolicy.java,
	javax/swing/UIManager.java,
	javax/swing/ViewportLayout.java,
	javax/swing/plaf/basic/BasicCheckBoxMenuItemUI.java,
	javax/swing/plaf/basic/BasicInternalFrameUI.java,
	javax/swing/plaf/basic/BasicLabelUI.java,
	javax/swing/plaf/basic/BasicListUI.java,
	javax/swing/plaf/basic/BasicMenuItemUI.java,
	javax/swing/plaf/basic/BasicMenuUI.java,
	javax/swing/plaf/basic/BasicOptionPaneUI.java,
	javax/swing/plaf/basic/BasicRadioButtonMenuItemUI.java,
	javax/swing/plaf/basic/BasicRootPaneUI.java,
	javax/swing/plaf/basic/BasicScrollPaneUI.java,
	javax/swing/plaf/basic/BasicSplitPaneDivider.java,
	javax/swing/plaf/basic/BasicTextUI.java,
	javax/swing/table/TableColumnModel.java,
	javax/swing/text/AbstractDocument.java,
	javax/swing/text/EditorKit.java,
	javax/swing/text/Position.java,
	javax/swing/text/Segment.java,
	javax/swing/text/StyledEditorKit.java,
	javax/swing/text/ViewFactory.java:
	Cleanup whitespace differences to classpath CVS HEAD.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* gnu/java/awt/peer/gtk/GdkPixbufDecoder.java:
	(finalize): Call finish from here.
	(produce): Not from here.
	* Makefile.am (gtk_c_source_files):
	Remove jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c.
	* Makefile.in: Regenerate.
	* gnu/java/awt/peer/gtk/GdkGraphics2D.java
	(cairoSetFont):
	(cairoDrawGdkTextLayout):
	(cairoDrawString):
	(getPeerTextMetrics):
	(getPeerFontMetrics): Remove.
	(setFont): Don't call cairoSetFont.
	(cairoDrawGlyphVector): Accept font peer argument.
	(drawGlyphVector): Pass font peer to cairoDrawGlyphVector.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
	(ensure_metrics_cairo):
	(gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont):
	(gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawString):
	(gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerFontMetrics):
	(gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics):
	(metrics_cairo):
	(metrics_surface): Remove.
	(gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGlyphVector):
	Pass and install font peer.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* Makefile.am: Create "split library" structure.
	* Makefile.in: Regenerate.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c:
	Release GDK lock during upcalls.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c: Remove.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
	(Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector):
	(Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics):
	(Java_gnu_java_awt_peer_gtk_GdkFontPeer_getTextMetrics): New methods.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c: Remove.
	* gnu/java/awt/peer/gtk/GdkFontPeer.java
	(getGlyphVector):
	(getFontMetrics):
	(getTextMetrics): New native methods.
	* gnu/java/awt/peer/gtk/GdkFontMetrics.java: Remove native parts.
	* gnu/java/awt/peer/gtk/GdkGlyphVector.java: Likewise.
	* Makefile.am: Remove native entries for GdkFontMetrics, GdkGlyphVector.
	* Makefile.in: Regenerate.

2005-02-15  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* javax/swing/SwingUtilities.java:
	(getAccessibleAt(java.awt.Component, java.awt.Point)):
	Implemented and documented.
	(getAccessibleChild(java.awt.Component, int)): Likewise.
	(getAccessibleChildrenCount(java.awt.Component)): Likewise.
	(getAccessibleIndexInParent(java.awt.Component)): Likewise.
	(getAccessibleStateSet(java.awt.Component)): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/SwingUtilities.java
	(getFontMetrics): Removed.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/Container.java
	(paramString): Implemented.
	* javax/swing/AbstractButton.java
	(paramString): Implemented.
	* javax/swing/JComponent.java
	(paramString): Implemented.
	* javax/swing/JMenu.java
	(paramString): Implemented.
	* javax/swing/JMenuBar.java
	(paramString): Implemented.
	* javax/swing/JMenuItem.java
	(paramString): Implemented.
	* javax/swing/JPopupMenu.java
	(paramString): Implemented.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JMenu.java
	(uiClassID): Removed.
	(JMenu): Set invoker on popup menu.
	(getUIClassID): Return id directly.
	(getItemCount): Simply return getMenuComponentCount().
	Fixed javadoc.
	(isTopLevelMenu): Simplified.
	* javax/swing/JMenuItem.java
	(uiClassID): Removed.
	(getUIClassID): Return id directly.
	* javax/swing/JPopupMenu.java
	(uiClassID): Removed.
	(JPopupMenu): Always initialize correctly.
	(getSubElements): Only return components implementing MenuElement
	interface.
	(HeavyWeightPopup.hide): Removed.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/image/ReplicateScaleFilter.java
	(replicatePixels): Made private.
	* javax/swing/colorchooser/DefaultRGBChooserPanel.java
	(DefaultRGBChooserPanel): Made package private.
	* javax/swing/colorchooser/DefaultSwatchChooserPanel.java
	(RecentSwatchPanel): Likewise.
	* javax/swing/event/MouseInputAdapter.java: Reformatted.
	(MouseInputAdapter): Made abstract.
	* javax/swing/tree/DefaultMutableTreeNode.java
	(random): Removed.
	(growTree): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/dnd/DropTarget.java (addDropTargetListener):
	Clarified comments.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JComponent.java (getComponentGraphics):
	Removed accidently commited code.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* java/awt/dnd/DropTarget.java
	(addDropTargetListener): Despite documentation, do not throw.
	* javax/swing/JComponent.java: Set a default DropTarget.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/AbstractAction.java
	(ENABLED_PROPERTY): Removed.
	(setEnabled): Replaced constant with real string.
	* javax/swing/AbstractButton.java
	(createActionPropertyChangeListener.propertyChange): Likewise.
	* javax/swing/JComboBox.java
	(DEFAULT_MAXIMUM_ROW_COUNT): Made private.
	(EDITABLE_CHANGED_PROPERTY): Removed.
	(MAXIMUM_ROW_COUNT_CHANGED_PROPERTY):Likewise.
	(ENABLED_CHANGED_PROPERTY):Likewise.
	(RENDERER_CHANGED_PROPERTY):Likewise.
	(EDITOR_CHANGED_PROPERTY):Likewise.
	(MODEL_CHANGED_PROPERTY):Likewise.
	(uiClassID):Likewise.
	(getUIClassID): Replaced constant with real string.
	(setModel):Likewise.
	(setEditable):Likewise.
	(setMaximumRowCount):Likewise.
	(setRenderer):Likewise.
	(setEditor):Likewise.
	(setEnabled):Likewise.
	* javax/swing/JLabel.java
	(DISABLED_ICON_CHANGED_PROPERTY): Removed.
	(DISPLAYED_MNEMONIC_CHANGED_PROPERTY): Likewise.
	(DISPLAYED_MNEMONIC_INDEX_CHANGED_PROPERTY): Likewise.
	(HORIZONTAL_ALIGNMENT_CHANGED_PROPERTY): Likewise.
	(HORIZONTAL_TEXT_POSITION_CHANGED_PROPERTY): Likewise.
	(ICON_CHANGED_PROPERTY): Likewise.
	(ICON_TEXT_GAP_CHANGED_PROPERTY): Likewise.
	(LABEL_FOR_CHANGED_PROPERTY): Likewise.
	(TEXT_CHANGED_PROPERTY): Likewise.
	(VERTICAL_ALIGNMENT_CHANGED_PROPERTY): Likewise.
	(VERTICAL_TEXT_POSITION_CHANGED_PROPERTY): Likewise.
	(setText): Replaced constant with real string.
	(setIcon): Likewise.
	(setDisabledIcon): Likewise.
	(setDisplayedMnemonic): Likewise.
	(setIconTextGap): Likewise.
	(setVerticalAlignment): Likewise.
	(setHorizontalAlignment): Likewise.
	(setVerticalTextPosition): Likewise.
	(setHorizontalTextPosition): Likewise.
	(setLabelFor): Replaced constant with real string.
	Fire property change event after property got changed.
	* javax/swing/JList.java
	(CELL_RENDERER_PROPERTY_CHANGED): Likewise.
	(FIXED_CELL_HEIGHT_PROPERTY_CHANGED): Likewise.
	(FIXED_CELL_WIDTH_PROPERTY_CHANGED): Likewise.
	(LAYOUT_ORIENTATION_PROPERTY_CHANGED): Likewise.
	(MODEL_PROPERTY_CHANGED): Likewise.
	(PROTOTYPE_CELL_VALUE_PROPERTY_CHANGED): Likewise.
	(SELECTION_BACKGROUND_PROPERTY_CHANGED): Likewise.
	(SELECTION_FOREGROUND_PROPERTY_CHANGED): Likewise.
	(SELECTION_MODEL_PROPERTY_CHANGED): Likewise.
	(setFixedCellWidth): Reimplemented.
	(setFixedCellHeight): Exit if new value is identical.
	Replaced constant with real string.
	(setSelectionBackground): Likewise.
	(setSelectionForeground): Likewise.
	(setPrototypeCellValue): Likewise.
	(setCellRenderer): Replaced constant with real string.
	(setModel): Likewise.
	(setSelectionModel): Likewise.
	* javax/swing/JMenuBar.java
	(BORDER_PAINTED_CHANGED_PROPERTY): Removed.
	(MODEL_CHANGED_PROPERTY): Likewise.
	(MARGIN_CHANGED_PROPERTY): Likewise.
	(setBorderPainted): Reimplemented.
	(setMargin): Likewise.
	(setSelectionModel): Replaced constant with real string.
	* javax/swing/JPopupMenu.java
	(LABEL_CHANGED_PROPERTY): Removed.
	(VISIBLE_CHANGED_PROPERTY): Likewise.
	(borderPainted): Likewise.
	(setLabel): Replaced constant with real string.
	(setVisible): Exit if new value is identical.
	Replaced constant with real string.
	* javax/swing/JProgressBar.java
	(BORDER_PAINTED_CHANGED_PROPERTY): Removed.
	(ORIENTATION_CHANGED_PROPERTY): Likewise.
	(STRING_CHANGED_PROPERTY): Likewise.
	(STRING_PAINTED_CHANGED_PROPERTY): Likewise.
	(INDETERMINATE_CHANGED_PROPERTY): Likewise.
	(setOrientation): Replaced constant with real string.
	(setStringPainted): Likewise.
	(setString): Likewise.
	(setBorderPainted): Likewise.
	(setIndeterminate): Likewise.
	* javax/swing/JScrollBar.java
	(BLOCK_INCREMENT_CHANGED_PROPERTY): Removed.
	(MODEL_CHANGED_PROPERTY): Likewise.
	(ORIENTATION_CHANGED_PROPERTY): Likewise.
	(setOrientation): Replaced constant with real string.
	(setModel): Likewise.
	(setUnitIncrement): Likewise.
	(setBlockIncrement): Likewise.
	* javax/swing/JScrollPane.java
	(COLUMN_HEADER_CHANGED_PROPERTY): Removed.
	(COMPONENT_ORIENTATION_CHANGED_PROPERTY): Likewise.
	(HORIZONTAL_SCROLLBAR_CHANGED_PROPERTY): Likewise.
	(HORIZONTAL_SCROLLBAR_POLICY_CHANGED_PROPERTY): Likewise.
	(LAYOUT_CHANGED_PROPERTY): Likewise.
	(ROW_HEADER_CHANGED_PROPERTY): Likewise.
	(VERTICAL_SCROLLBAR_CHANGED_PROPERTY): Likewise.
	(VERTICAL_SCROLLBAR_POLICY_CHANGED_PROPERTY): Likewise.
	(VIEWPORT_CHANGED_PROPERTY): Likewise.
	(VIEWPORT_BORDER_CHANGED_PROPERTY): Likewise.
	(WHEEL_SCROLLING_ENABLED_CHANGED_PROPERTY): Likewise.
	(setComponentOrientation): Replaced constant with real string.
	(setColumnHeader): Likewise.
	(setHorizontalScrollBar): Likewise.
	(setHorizontalScrollBarPolicy): Likewise.
	(setRowHeader): Likewise.
	(setVerticalScrollBar): Likewise.
	(setVerticalScrollBarPolicy): Likewise.
	(setWheelScrollingEnabled): Likewise.
	(setViewport): Likewise.
	(setViewportBorder): Likewise.
	* javax/swing/JSlider.java
	(INVERTED_CHANGED_PROPERTY): Removed.
	(LABEL_TABLE_CHANGED_PROPERTY): Likewise.
	(MAJOR_TICK_SPACING_CHANGED_PROPERTY): Likewise.
	(MINOR_TICK_SPACING_CHANGED_PROPERTY): Likewise.
	(MODEL_CHANGED_PROPERTY): Likewise.
	(ORIENTATION_CHANGED_PROPERTY): Likewise.
	(PAINT_LABELS_CHANGED_PROPERTY): Likewise.
	(PAINT_TICKS_CHANGED_PROPERTY): Likewise.
	(setModel): Replaced constant with real string.
	(setOrientation): Likewise.
	(setLabelTable): Likewise.
	(setInverted): Likewise.
	(setMajorTickSpacing): Likewise.
	(setMinorTickSpacing): Likewise.
	(setPaintTicks): Likewise.
	(setPaintLabels): Likewise.
	* javax/swing/JTabbedPane.java
	(MODEL_CHANGED_PROPERTY): Removed.
	(TAB_PLACEMENT_CHANGED_PROPERTY): Likewise.
	(TAB_LAYOUT_POLICY_CHANGED_PROPERTY): Likewise.
	(setModel): Replaced constant with real string.
	(setTabPlacement): Likewise.
	(setTabLayoutPolicy): Likewise.
	* javax/swing/JToolBar.java
	(ORIENTATION_CHANGED_PROPERTY): Removed.
	(FLOATABLE_CHANGED_PROPERTY): Likewise.
	(BORDER_PAINTED_CHANGED_PROPERTY): Likewise.
	(MARGIN_CHANGED_PROPERTY): Likewise.
	(ROLLOVER_CHANGED_PROPERTY): Likewise.
	(setRollover): Replaced constant with real string.
	(setMargin): Likewise.
	(setBorderPainted): Likewise.
	(setFloatable): Likewise.
	(setOrientation): Likewise.
	* javax/swing/plaf/basic/BasicComboBoxUI.java
	(PropertyChangeHandler.propertyChange): Likewise.
	* javax/swing/plaf/basic/BasicComboPopup.java
	(PropertyChangeHandler.propertyChange): Likewise.
	* javax/swing/plaf/basic/BasicMenuBarUI.java
	(PropertyChangeHandler.propertyChange): Likewise.
	* javax/swing/plaf/basic/BasicProgressBarUI.java
	(PropertyChangeHandler.propertyChange): Likewise.
	* javax/swing/plaf/basic/BasicScrollBarUI.java
	(PropertyChangeHandler.propertyChange): Likewise.
	* javax/swing/plaf/basic/BasicSliderUI.java
	(PropertyChangeHandler.propertyChange): Likewise.
	* javax/swing/plaf/basic/BasicTabbedPaneUI.java
	(PropertyChangeHandler.propertyChange): Likewise.
	* javax/swing/plaf/basic/BasicToolBarUI.java
	(PropertyChangeHandler.propertyChange): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DefaultButtonModel.java
	(changeState): Made private.
	* javax/swing/DefaultDesktopManager.java
	(setWasIcon): Fixed second argument to be java.lang.Boolean.
	* javax/swing/JLayeredPane.java
	(layerToRange): Made private.
	(incrLayer): Likewise.
	(decrLayer): Likewise.
	* javax/swing/JTable.java
	(dragEnabled): Likewise.
	(preferredViewportSize): Renamed from preferredScrollableViewportSize.
	* javax/swing/KeyStroke.java
	(Keystroke): Made private.
	* javax/swing/TransferHandler.java
	(COMMAND_COPY): Likewise.
	(COMMAND_CUT): Likewise.
	(COMMAND_PASTE): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTextField.java
	(postActionEvent): Use text in field when actionCommand is null.
	(getActionCommand): Removed.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/AbstractSet.java: Removed.
	* Makefile.am: Removed javax/swing/AbstractSet.java.
	* Makefile.in: Regenerated.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/Window.java
	(AccessibleWindow.getAccessibleStateSet): Fixed method name.
	* java/awt/dnd/DnDConstants.java
	(DnDConstants): New private constructor.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DefaultCellRenderer.java: Removed.
	* Makefile.am: Removed javax/swing/DefaultCellRenderer.java.
	* Makefile.in: Regenerated.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/AbstractButton.java
	(fireItemStateChanged): Made protected.
	(fireActionPerformed): Likewise.
	(fireStateChanged): Likewise.
	* javax/swing/DefaultButtonModel.java
	(fireItemStateChanged): Likewise.
	(fireActionPerformed): Likewise.
	(fireStateChanged): Likewise.
	* javax/swing/JApplet.java
	(JApplet): Removed.
	(frameInit): Likewise.
	(setRootPane): Made protected.
	(createRootPane): Likewise.
	* javax/swing/JComponent.java
	(getClientProperty): Likewise.
	(putClientProperty): Likewise.
	* javax/swing/JEditorPane.java
	(getContentType): Likewise.
	(setContentType): Likewise.
	* javax/swing/JFrame.java
	(setRootPane): Likewise.
	(createRootPane): Likewise.
	* javax/swing/JInternalFrame.java
	(getFocusCycleRootAncestor): Made final. Added @since tag.
	(isFocusCycleRoot): Likewise.
	(getWarningString): Made final.
	* javax/swing/JScrollBar.java
	(changeListener): Removed.
	(changeEvent): Likewise.
	(createChangeListener): Likewise.
	(fireStateChanged): Likewise.
	(addChangeListener): Likewise.
	(removeChangeListener): Likewise.
	(getChangeListeners): Likewise.
	* javax/swing/JScrollPane.java
	(createViewport): Made protected.
	* javax/swing/JViewport.java
	(addImpl): Likewise.
	(setBorder): New method.
	* javax/swing/JWindow.java
	(setRootPane): Made protected.
	(createRootPane): Likewise.
	* javax/swing/plaf/basic/BasicButtonUI.java
	(installListeners): Likewise.
	(uninstallListeners): Likewise.
	* javax/swing/plaf/basic/BasicProgressBarUI.java
	(incrementAnimationIndex): Likewise.
	* javax/swing/plaf/basic/BasicTabbedPaneUI.java
	(createLayoutManager): Likewise.
	* javax/swing/table/DefaultTableCellRenderer.java
	(firePropertyChange): Likewise.
	* javax/swing/table/JTableHeader.java
	(AccessibleJTableHeaderEntry.AccessibleJTableHeaderEntry):
	New constructor.
	* javax/swing/text/PlainDocument.java
	(reindex): Made private.
	* javax/swing/text/PlainView.java
	(drawLine): Made protected.
	(getTabSize): Likewise.
	* javax/swing/text/View.java
	(setSize): Removed.
	(preferenceChanged): New method.
	(getBreakWeight): Likewise.
	(breakView): Likewise.
	(getViewIndex): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JScrollPane.java
	(ScrollBar): Made class protected.
	* javax/swing/JSpinner.java
	(JSpinner): Added @since tag.
	(listenerList): Removed.
	* javax/swing/JTable.java
	(setValueAt): New method.
	(getColumn): Likewise.
	* javax/swing/JWindow.java
	(rootPaneCheckingEnabled): Renamed from checking.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/plaf/basic/BasicTextUI.java
	(RootView.modelToView): Made it public and return a java.awt.Shape.
	Handle null subview.
	(uninstall): Set textComponent to null when its not possible used
	anymore.
	* javax/swing/text/View.java
	(setParent): Use better argument name.
	(getContainer): Get parent via getParent().
	(getViewFactory): Likewise.
	(getAttributes): Get element via getElement().
	(getStartOffset): Likewise.
	(getEndOffset): Likewise.
	(getResizeWeight): New method.
	(getMaximumSpan): Likewise.
	(getMinimumSpan): Likewise.
	(setSize): Likewise.
	(getGraphics): Likewise.

2005-02-15  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/awt/Checkbox.java:
	(AccessibleAWTCheckbox()): Added public constructor
	to call superclass.
	* java/awt/Choice.java:
	(AccessibleAWTChoice): Added class documentation.
	(AccessibleAWTChoice()): Added public constructor
	to call superclass.
	(AccessibleAWTChoice.getAccessibleAction()): Documented.
	(AccessibleAWTChoice.getAccessibleRole()): Documented,
	and changed role to COMBO_BOX.
	(AccessibleAWTChoice.getAccessibleActionCount()): Documented.
	(AccessibleAWTChoice.getAccessibleActionDescription(int)): Documented.
	(AccessibleAWTChoice.doAccessibleAction(int)): Documented.

2005-02-15  Graydon Hoare  <graydon@redhat.com>
	    Michael Koch  <konqueror@gmx.de>

	* javax/swing/LayoutFocusTraversalPolicy.java,
	javax/swing/SortingFocusTraversalPolicy.java:
	New classes.
	* Makefile.am: Added new classes.
	* Makefike.in: Regenerated.


2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DebugGraphics.java: Mostly implemented.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/SwingUtilities.java
	(findFocusOwner): New method.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/DefaultEditorKit.java
	(read): Added '\n' after each line.
	* javax/swing/text/PlainView.java
	(modelToView): Update metrics.
	(drawLine): Use offsets from element.
	(paint): Update metrics. Draw all lines.

2005-02-15  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/awt/Checkbox.java:
	(AccessibleAWTCheckbox): Added class documentation
	* java/awt/Scrollbar.java:
	(AccessibleAWTScrollBar): typo corrected and docs added
	(AccessibleAWTScrollBar.getAccessibleRole()): documented
	(AccessibleAWTScrollBar.getAccessibleStateSet()): likewise
	(AccessibleAWTScrollBar.getAccessibleValue()): likewise
	(AccessibleAWTScrollBar.getCurrentAccessibleValue()): likewise
	(AccessibleAWTScrollBar.setCurrentAccessibleValue(int)): likewise
	(AccessibleAWTScrollBar.getMinimumAccessibleValue()): likewise
	(AccessibleAWTScrollBar.getMaximumAccessibleValue()): likewise
	(getAccessibleContext()): name of accessible class corrected

2005-02-15  Mark Wielaard  <mark@klomp.org>

	* java/awt/BasicStroke.java (hashCode): Implement.
	(equals): Document.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/print/PrinterJob.java
	(pageDialog): Throws java.awt.HeadlessException.
	(printDialog): Likewise.

2005-02-15  Mark Wielaard  <mark@klomp.org>

	* jni/gtk-peer/gtkpeer.h (gdk_env): Fix prototype.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTable.java
	(getValueAt): New method.
	* javax/swing/table/JTableHeader.java
	(columnAtPoint): New method.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTextField.java
	(actions): New field.
	(static): Initalize actions field.
	(getActions): New method.

2005-02-15  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* java/awt/Checkbox.java:
	(AccessibleAWTCheckbox): name capitalization corrected
	and serialization UID added.
	(AccessibleAWTCheckbox.itemStateChanged(java.awt.event.ItemEvent)):
	documented.
	(AccessibleAWTCheckbox.getAccessibleAction()): likewise
	(AccessibleAWTCheckbox.getAccessibleValue()): likewise
	(AccessibleAWTCheckbox.getAccessibleActionCount()): likewise
	(AccessibleAWTCheckbox.getAccessibleActionDescription(int)): likewise
	(AccessibleAWTCheckbox.doAccessibleAction(int)): likewise
	(AccessibleAWTCheckbox.getCurrentAccessibleValue()): likewise
	(AccessibleAWTCheckbox.setCurrentAccessibleValue(int)): likewise
	(AccessibleAWTCheckbox.getMinimumAccessibleValue()): likewise
	(AccessibleAWTCheckbox.getMaximumAccessibleValue()): likewise
	(AccessibleAWTCheckbox.getAccessibleRole()): likewise
	(AccessibleAWTCheckbox.getAccessibleStateSet()): implemented and
	documented
	(getAccessibleContext()): name of accessible class corrected

2005-02-15  Sven de Marothy  <sven@physto.se>

	* java/awt/geom/doc-files/Area-1.png,
	java/awt/geom/doc-files/Ellipse-1.png,
	java/awt/geom/doc-files/GeneralPath-1.png:
	New files.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c (env_union):
	Use union to avoid type-punning warning.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DefaultListSelectionModel.java
	(clone): New method.

2005-02-15  Mark Wielaard  <mark@klomp.org>

	Reported by Martin Platter <motse@complang.tuwien.ac.at>
	* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
	(Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile):
	Correct method signature of gtkSetFilename.

2005-02-15  Arnaud Vandyck  <avdyk@gnu.org>

	* javax/swing/text/StringContent.java: New file.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* Makefile.am: Added javax/swing/text/StringContent.java.
	* Makefile.in: Regenerated.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/ClasspathToolkit.java:
	Import statements reworked.
	(imageCache): Made it of type java.util.HashMap.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/imageio/stream/MemoryCacheImageInputStream.java:
	Reworked import statements.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c:
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c:
	Rewrite uses of extern variable to be function calls.
	* jni/gtk-peer/gtkpeer.h (gdk_env): Change declaration to
	function, from extern variable.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c
	(gdk_env): Remove variable, add new function.
	(java_vm): Add new variable.
	(Java_gnu_java_awt_peer_gtk_GtkToolkit_gtkInit): Initialize
	java_vm rather than old gdk_env variable.

2005-02-15 David Gilbert <david.gilbert@object-refinery.com>

	* javax/swing/DefaultListModel.java
	(add): fire correct event,
	(addElement): corrected interval indices in event,
	(clear): corrected upper bound for interval, only fire event if
	list is not empty,
	(setSize): fire appropriate event.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* gnu/awt/xlib/XEventLoop.java: Add non-blocking event mode.
	* gnu/awt/xlib/XToolkit.java: Likewise.
	* gnu/gcj/xlib/XAnyEvent.java: Likewise.
	* gnu/gcj/xlib/natXAnyEvent.cc: Likewise.
	* gnu/java/awt/ClasspathToolkit.java: Likewise.
	* gnu/java/awt/peer/gtk/GtkToolkit.java: Likewise.
	* java/awt/EventQueue.java (getNextEvent):
	Adjust event loop to switch to native mode after 100ms.
	* javax/swing/Timer.java (drainEvents): Reuse Runnable.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c
	(Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose):
	Wake up event thread.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c
	(Java_gnu_java_awt_peer_gtk_GtkToolkit_iterateNativeQueue):
	Adjust event loop to switch to java mode after 100ms.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* jni.cc (_Jv_JNI_RegisterNatives): Re-add sync, which was
	accidentally removed in last change.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,
	gnu/java/awt/peer/gtk/GtkMainThread.java: Removed.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* include/jni.h (_Jv_JNIEnv::bottom_locals): New field.
	* include/jvm.h (_Jv_FreeJNIEnv): Declare.
	* java/lang/natThread.cc (finalize_native): Call _Jv_FreeJNIEnv.
	* jni.cc: Reuse bottom frame between calls, avoid clearing
	frame when no local references are made.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/UIDefaults.java (UIDefaults):
	Fixed typo in javadoc (Thanks to Thomas Zander for reporting)
	Fixed HTML entity and removed a redundant comma.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/DefaultEditorKit.java
	(deinstall): Removed.
	(install): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/UIDefaults.java (put): Handle value of null.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/Robot.java,
	java/awt/Scrollbar.java,
	java/awt/print/PrinterJob.java,
	javax/swing/JTable.java,
	javax/swing/text/AbstractDocument.java:
	Reworked import statements.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JEditorPane.java
	(read): Implemented.
	(write): Likewise.
	* javax/swing/text/DefaultEditorKit.java
	(page): Renamed from page_url. Made private.
	(editorKit): Renamed from kit. Made private.
	(ctype): Removed.
	(JEditorPane): All constructors reimplemented.
	(getContentType): Use content type from editor kit.
	(getEditorKit): Return editorKit.
	(getEditorKitForContentType):Likewise.
	(getPage): Return page.
	(setContentType): Reimplemented.
	(setEditorKit): Likewise.
	(setEditorKitForContentType): Removed wrong implementation.
	(setPage): Implemented.

2005-02-15  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c
	(nativeSetIconImageFromData): Re-add native implementation.

2005-02-15  David Gilbert  <david.gilbert@object-refinery.com>

	* javax/swing/table/DefaultTableModel.java
	(DefaultTableModel()): Added Javadocs.
	(DefaultTableModel(int, int)): Fixed implementation.
	(DefaultTableModel(Vector, int)): Throw IllegalArgumentException
	for negative rowCount.
	(DefaultTableModel(Object[], int)): Added Javadocs.
	(DefaultTableModel(Vector, Vector)): Likewise.
	(DefaultTableModel(Object[][], Object[])): Likewise.
	(getDataVector): Likewise.
	(setDataVector(Vector, Vector)): Likewise.
	(setDataVector(Object[][], Object[])): Likewise.
	(newDataAvailable): Likewise.
	(newRowsAdded): Likewise.
	(rowsRemoved): Likewise.
	(setColumnIdentifiers(Vector)): Allow for null argument.
	(setColumnIdentifiers(Object[])): Added Javadocs.
	(setNumRows): Likewise.
	(setRowCount): Adds new rows if necessary, and sends more specific
	TableModelEvent.
	(setColumnCount): Allow for null columnIdentifiers.
	(addColumn(Object)): Added Javadocs.
	(addColumn(Object, Vector)): Handle null columnData.
	(addColumn(Object, Object[])): Handle columnData with more or less
	entries than rows in the table.
	(addRow(Vector)): Fire appropriate event.
	(addRow(Object[])): Added Javadocs.
	(insertRow(int, Vector)): Fire appropriate event.
	(insertRow(int, Object[])): Added Javadocs.
	(moveRow): Reimplemented.
	(removeRow(int)): Fire appropriate event.
	(getColumnCount): Allow for null columnIdentifiers.
	(getColumnName): Now returns empty string when column index is too
	large.
	(isCellEditable): Added Javadocs.
	(getValueAt): Likewise.
	(setValueAt): Fire more specific event.
	(convertToVector): Added Javadocs.
	* javax/swing/table/TableModel.java
	Added Javadocs.

2005-02-15  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* libgcj.spec.in (lib): Add -l-javax-imageio.

2005-02-15  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/java/awt/peer/gtk/GtkComponentPeer.java: Replace direct
	references to event queue q with method call q().
	* gnu/java/awt/peer/gtk/GtkDialogPeer.java: Likewise.
	* gnu/java/awt/peer/gtk/GtkFramePeer.java: Likewise.
	* gnu/java/awt/peer/gtk/GtkScrollbarPeer.java: Likewise.
	* gnu/java/awt/peer/gtk/GtkTextComponentPeer.java: Likewise.
	* gnu/java/awt/peer/gtk/GtkWindowPeer.java: Likewise.
	* gnu/java/awt/peer/gtk/GtkGenericPeer.java: Likewise.
	(q): New method.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* gnu/java/awt/ClasspathToolkit.java
	(registerImageIOSpis): New method.
	* gnu/java/awt/image/ImageDecoder.java
	(imageDecoder): New constructor using InputStream
	(startProduction): Handle existing InputStream.
	* gnu/java/awt/peer/gtk/GdkGraphics2D.java
	(findSimpleIntegerArray): Make public and static.
	(updateBufferedImage): Set each pixel, in a loop.
	* gnu/java/awt/peer/gtk/GdkPixbufDecoder.java:
	Implement ImageIO SPI classes.
	(createBufferedImage): Rewrite in terms of SPI classes.
	* gnu/java/awt/peer/gtk/GtkToolkit.java
	(registerImageIOSpis): New method.
	* java/lang/reflect/natMethod.cc
	(_Jv_CallAnyMethodA): Borrow a patch from aph, applied to trunk,
	which lets JNI call interface methods properly.
	* javax/imageio/ImageIO.java
	(WriterFormatFilter.filter): Fix copy-and-paste typos.
	(WriterMIMETypeFilter.filter): Likewise.
	(ImageReaderIterator): Pass extension argument through to SPI.
	(getReadersByFilter): Likewise.
	(getWritersByFilter): Likewise.
	(getImageReadersByFormatName): Likewise.
	(getImageReadersByMIMEType): Likewise.
	(getImageReadersBySuffix): Likewise.
	(getImageWritersByFormatName): Likewise.
	(getImageWritersByMIMEType): Likewise.
	(getImageWritersBySuffix): Likewise.
	(read): Implement.
	(write): Implement.
	* javax/imageio/ImageReader.java
	(progressListeners): Initialize.
	(setInput): Implement.
	* javax/imageio/ImageWriter.java
	(progressListeners): Initialize.
	(warningListeners): Likewise.
	(warningLocales): Likewise.
	(setOutput): Test "isInstance" rather than class equality.
	* javax/imageio/spi/IIORegistry.java
	(static): Add reader and writer SPIs.
	(IIORegistry): Call ClasspathToolkit.registerImageIOSpis.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
	(query_formats): New function.
	(save_to_stream): Likewise.
	(Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage): Likewise.

2005-02-15  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c (mouseWheel):
	Call XFlush.
	(keyPress): Likewise.
	(keyRelease): Likewise.

2005-02-15  Olga Rodimina  <rodimina@redhat.com>

	* javax/swing/JTable.java
	(columnAtPoint): New Method. Implemented.
	(rowAtPoint): Likewise.
	(countSelections): Fixed few small count errors.
	(getSelections): Likewise.
	(setSelectionMode): Set selection mode for column
	selection model in addition to row selection model.
	* javax/swing/plaf/basic/BasicTableUI.java:
	(getRowForPoint): Removed. Replaced by
	JTable.rowAtPoint().
	(getColForPoint): Removed. Replaced by
	JTable.columnAtPoint().
	(updateSelection): Updated to call JTable.columnAtPoint
	and JTable.rowAtPoint.
	* javax/swing/table/DefaultTableColumnModel.java:
	(getSelectedColumns): Implemented.
	(getSelectedColumnCount): Implemented.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* Makefile.am
	(jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c)
	(gnu/java/awt/peer/gtk/GtkMainThread.java) : Remove.
	* Makefile.in: Regenerate.
	* gnu/awt/xlib/XEventLoop.java: Fix to match thread model.
	* gnu/awt/xlib/XFramePeer.java: Likewise.
	* gnu/awt/xlib/XToolkit.java: Likewise.
	* gnu/gcj/xlib/XAnyEvent.java: Likewise.
	* gnu/gcj/xlib/natXAnyEvent.cc: Likewise.
	* gnu/java/awt/ClasspathToolkit.java
	(nativeQueueEmpty)
	(wakeNativeQueue)
	(iterateNativeQueue): New methods.
	* gnu/java/awt/peer/gtk/GtkMainThread.java: Remove.
	* gnu/java/awt/peer/gtk/GtkToolkit.java
	(gtkInit): Absorb from defunct GtkMainThread class.
	(static): Run gtkInit in static startup block.
	(GtkToolkit): Remove construction of GtkMainThread and queue.
	(getSystemEventQueueImpl): Construct queue when requested.
	(nativeQueueEmpty)
	(wakeNativeQueue)
	(iterateNativeQueue): New methods.
	* java/awt/Component.java (removeNotify): Remove race.
	* java/awt/EventDispatchThread.java
	(EventDispatchThread): Don't start on construction.
	(run): Remove isInterrupted check.
	* java/awt/EventQueue.java (shutdown): New flag.
	(isShutdown): New method checking J2SE shutdown condition.
	(setShutdown): New method.
	(getNextEvent): Restructure to use ClasspathToolkit.
	(postEvent): Activate new thread on posting, wake thread on
	post of possible shutdown condition event.
	* java/awt/Frame.java
	(Frame): Call noteFrame in all constructors.
	(fireDummyEvent): New helper method.
	(addNotify): Fire a dummy event to wake up queue.
	(removeNotify): Fire a dummy event to wake up queue.
	(noteFrame): New method.
	(weakFrames): New static field.
	(getFrames): Implement.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c:
	Remove.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c:
	Move everything from GtkMainThread into this file
	(Java_gnu_java_awt_peer_gtk_GtkToolkit_iterateNativeQueue)
	(Java_gnu_java_awt_peer_gtk_GtkToolkit_wakeNativeQueue)
	(Java_gnu_java_awt_peer_gtk_GtkToolkit_nativeQueueEmpty):
	New functions to implement single-threaded queue semantics.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/plaf/metal/MetalLookAndFeel.java
	(getControlTextFont): New method.
	(getMenuTextFont): Likewise.
	(getSubTextFont): Likewise.
	(getSystemTextFont): Likewise.
	(getUserTextFont): Likewise.
	(getWindowTitleFont): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/AbstractDocument.java
	(documentFilter): New field.
	(getDocumentFilter): New method.
	(setDocumentFilter): Likewise.
	(dump): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTree.java
	(DynamicUtilTreeNode.hasChildren): Clarify javadoc.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/AbstractDocument.java
	(AbstractElement.getLength): Fixed off-by-one error.
	(AbstractElement.children): Made abstract.
	(AbstractElement.getAllowsChildren): Likewise.
	(AbstractElement.getElement): Likewise.
	(AbstractElement.dumpElement): New private method.
	(AbstractElement.dump): New method.
	(BranchElememt.getName): Fixed implementation.
	(BranchElememt.toString): Likewise.
	(BranchElememt.getElement): Fixed arguments.
	(LeafElement.getName): Fixed implementation.
	(LeafElement.toString): Likewise.
	* javax/swing/text/GapContent.java
	(GapContent): Put default content into buffer.
	* javax/swing/text/PlainDocument.java
	(reindex): Use empty attribute sets instead of null.
	(createDefaultRoot): Reimplemented.
	(insertUpdate): Call super method.
	(removeUpdate): Likewise.
	(getParagraphElement): Implemented.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/ClasspathToolkit.java
	(createRobot): Throws java.awt.AWTException.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c:
	Added '__attribute__((unused))' to all unused method arguments.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DefaultBoundedRangeModel.java
	(fireValueChanged): Fixed off-by-one error.

2005-02-15  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* Makefile.am (gtk_c_source_files): Add GdkRobotPeer.c.
	(gtk_awt_peer_sources): Add GdkScreenGraphicsDevice.java and
	GdkRobotPeer.java.
	(lib_gnu_java_awt_peer_gtk_la_CFLAGS): Add X flags.
	(lib_gnu_java_awt_peer_gtk_la_LDFLAGS): Add XTest flags.
	* gnu/awt/xlib/XToolkit.java (createRobot): New method.
	* gnu/java/awt/ClasspathToolkit.java (createRobot): New method.
	* gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java
	(getDefaultScreenDevice): Implement.
	* gnu/java/awt/peer/gtk/GdkRobotPeer.java: New file.
	* gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java: Likewise.
	* gnu/java/awt/peer/gtk/GtkToolkit.java (createRobot): New method.
	* java/awt/Robot.java: Implement.
	* java/awt/peer/RobotPeer.java: Rename parameters.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkRobotPeer.c: New file.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
	(awt_keycode_to_keysym): Make non-static.
	* jni/gtk-peer/gtkpeer.h (AWT_BUTTON1_MASK, AWT_BUTTON2_MASK,
	AWT_BUTTON3_MASK): Declare constants.
	(awt_keycode_to_keysym): Declare.

	* Makefile.am (AM_MAKEFLAGS): Set KEYS variable.
	* testsuite/libjava.mauve/mauve.exp (test_mauve): If KEYS exists
	and is non-empty pass its value to "make check".
	(test_mauve_sim): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/imageio/IIOParam.java
	(setSourceBands): New method.
	(setSourceSubsampling): Likewise.
	* javax/imageio/ImageReadParam.java
	(setDestination): Likewise.
	(setDestinationBands): Likewise.
	(setSourceProgressivePasses): Likewise.
	* javax/imageio/metadata/IIOInvalidTreeException.java
	(serialVersionUID): New static field.
	* javax/imageio/metadata/IIOMetadataNode.java
	(IIOMetadataNode): Don't explicitely implement org.w3c.dom.Node.
	(parent): Dont initailize with default value explicitely.
	(Object): Likewise.
	(removeAttribute): Doesn't throws org.w3c.dom.DOMException.
	(removeAttributeNode): Likewise.
	(removeAttributeNS): Likewise.
	(setAttribute): Likewise.
	(setAttributeNode): Likewise.
	(setAttributeNodeNS): Likewise.
	(setAttributeNS): Likewise.
	(appendChild): Likewise.
	(getNodeValue): Likewise.
	(insertBefore): Likewise.
	(removeChild): Likewise.
	(replaceChild): Likewise.
	(setPrefix): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/LookAndFeel.java
	(getDesktopPropertyValue): New method.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTree.java
	(hasChildren): New instance field.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JComponent.java
	(getToolTipText): New method.
	(getTitledBorderText): Likewise.
	(getAccessibleKeyBinding): Likewise.
	(getVerifyInputWhenFocusTarget): Likewise.
	(setVerifyInputWhenFocusTarget): Likewise.
	(verifyInputWhenFocusTarget): New instance field.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DefaultListSelectionModel.java
	(fireValueChanged): New method.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DefaultBoundedRangeModel.java:
	Fixed javadocs all over.
	(fireStateChanged): Simplified.
	* javax/swing/BoundedRangeModel.java:
	Reformatted.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JRootPane.java
	(setMenuBar): Added @deprecated tag.
	(getMenuBar): Likewise.
	* javax/swing/JTable.java
	(sizeColumnsToFit): Likewise.

2005-02-15  Paul Jenner  <psj.home@ntlworld.com>

	* javax/swing/ImageIcon.java (setImage): Implemented.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTable.java:
	Removed unused imports.

2005-02-15  Olga Rodimina  <rodimina@redhat.com>

	(prepareRenderer): Get column's index in dataModel instead
	of column's view index.
	(getColumnCount): return count of the columns in ColumnModel,
	not in dataModel.
	(removeColumn): Implemented.
	(moveColumm): Likewise.
	(setRowHeight): throw IllegalArgumentException if height is
	less then 1.
	* javax/swing/table/DefaultTableColumnModel.java: Add javadocs.
	(DefaultTableColumnModel):Add call to createSelectionModel().
	(addColumn): Fire columnAdded event to registered listeners.
	(removeColumn): Fire columnRemoved event to registered listeners.
	(moveColumn): Fire columnMoved event to registered listeners.
	(setColumnMargin): Fire ColumnMarginChanged event to registered listeners.
	(getColumnIndex): Changed parameter name.
	(setColumnSelectionAllowed): Likewise.
	(fireColumnAdded): Implemented.
	(fireColumnRemoved): Likewise.
	(fireColumnMoved): Likewise.
	(fireColumnMarginChanged): Likewise.
	(getListeners): Changed parameter name.
	(propertyChange): Implemented.
	(valueChanged): Changed parameter name.
	(createSelectionModel): Implemented.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/peer/gtk/GtkToolkit.java:
	Explicitely import used classes.
	(getLocalGraphicsEnvironment): Simplify.
	* java/awt/Window.java (Window):
	Enable code to get the default GraphicsConfiguration.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/plaf/metal/DefaultMetalTheme.java
	(CONTROL_TEXT_FONT): New static field.
	(MENU_TEXT_FONT): Likewise.
	(SUB_TEXT_FONT): Likewise.
	(SYSTEM_TEXT_FONT): Likewise.
	(USER_TEXT_FONT): Likewise.
	(WINDOW_TITLE_FONT): Likewise.
	(getControlTextFont): New method.
	(getMenuTextFont): Likewise.
	(getSubTextFont): Likewise.
	(getSystemTextFont): Likewise.
	(getUserTextFont): Likewise.
	(getWindowTitleFont): Likewise.
	* javax/swing/plaf/metal/MetalTheme.java
	(BLACK): Initialize with Color.BLACK.
	(WHITE): Initialize with Color.WHITE.
	(getInactiveControlTextColor): Return getControlDisabled().
	(getMenuDisabledForeground): Return getSecondary3().
	(getControlTextFont): New abstract method.
	(getMenuTextFont): Likewise.
	(getSubTextFont): Likewise.
	(getSystemTextFont): Likewise.
	(getUserTextFont): Likewise.
	(getWindowTitleFont): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JFormattedTextField.java
	(getFocusLostBehavior): Fixed typo in method name.
	(setFocusLostBehavior): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/TransferHandler.java:
	Reworked import statements.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* java/awt/Button.java,
	java/awt/Canvas.java,
	java/awt/Checkbox.java,
	java/awt/CheckboxMenuItem.java,
	java/awt/Choice.java,
	java/awt/Dialog.java,
	java/awt/Frame.java,
	java/awt/Label.java,
	java/awt/List.java,
	java/awt/Menu.java,
	java/awt/MenuBar.java,
	java/awt/MenuItem.java,
	java/awt/PopupMenu.java,
	java/awt/ScrollPane.java,
	java/awt/Scrollbar.java,
	java/awt/TextArea.java,
	java/awt/Window.java (getAccessibleContext): Clean up comments.
	Reformat.
	* java/awt/Button.java,
	java/awt/Checkbox.java,
	java/awt/Choice.java,
	java/awt/Menu.java,
	java/awt/PopupMenu.java,
	java/awt/TextArea.java (getAccessibleContext): Only create new
	accessible once.
	* java/awt/TextComponent.java (getAccessibleContext): Implement.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/Button.java,
	javax/swing/JApplet.java,
	javax/swing/JFormattedTextField.java,
	javax/swing/JWindow.java,
	javax/swing/JTree.java,
	javax/swing/plaf/basic/BasicEditorPaneUI.java,
	javax/swing/plaf/basic/BasicTextPaneUI.java,
	javax/swing/plaf/basic/BasicTreeUI.java:
	Reworked import statements.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* Makefile.am: Put javax.imageio into its own library and link it
	against lib-org-w3c-dom.la to fix bootstrapping.
	* Makefile.in: Regenerated.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/TextAction.java
	(getTextComponent): Simplified. Added Javadoc.
	(augmentList): Implemented. Added Javadoc.
	(getFocusedComponent): Added javadoc.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* java/awt/Scrollbar.java (AccessibleAWTScrollbar,
	getAccessibleContext): Implement.
	* java/awt/ScrollPane.java (AccessibleAWTScrollPane,
	getAccessibleContext): Implement.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* java/awt/Dialog.java (AccessibleAWTFrame, getAccessibleContext):
	Implement.
	* java/awt/Frame.java (AccessibleAWTFrame, getAccessibleContext):
	Implement.
	* java/awt/Window.java (getAccessibleContext): Fix comment.
	Remove extra import.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* java/awt/Window.java (AccessibleAWTWindow): Implement.
	(isActive, isFocused, getAccessibleContext): Implement.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* java/awt/MenuItem.java (getAccessibleContext): Implement.
	* java/awt/MenuComponent.java (accessibleContext): Make package
	visible.
	* java/awt/CheckboxMenuItem.java (getAccessibleContext,
	AccessibleAWTCheckboxMenuItem): Implement.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* java/awt/List.java: Implement AccessibleAWTList,
	AccessibleAWTListChild.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* java/awt/Choice.java: Add implements declaration for
	Accessible.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* javax/imageio/metadata/IIOInvalidTreeException.java: Use Node
	instead of Object.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* javax/imageio/metadata/IIOMetadataNode.java: Add Node to
	implemented interface list.

2005-02-15  Jerry Quinn  <jlquinn@optonline.net>

	* javax/imageio/metadata/IIOMetadataNode.java: Implement.
	* javax/imageio/metadata/IIOAttr.java: New class.
	* javax/imageio/metadata/IIONamedNodeMap.java: New class.
	* javax/imageio/metadata/IIONodeList.java: New class.
	* Makefile.am: Added new files.
	* Makefile.in: Regenerated.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/AbstractAction.java,
	javax/swing/AbstractCellEditor.java,
	javax/swing/AbstractListModel.java,
	javax/swing/DefaultBoundedRangeModel.java,
	javax/swing/DefaultButtonModel.java,
	javax/swing/DefaultCellEditor.java,
	javax/swing/DefaultComboBoxModel.java,
	javax/swing/DefaultDesktopManager.java,
	javax/swing/JMenu.java,
	javax/swing/JSlider.java,
	javax/swing/KeyStroke.java,
	javax/swing/OverlayLayout.java,
	javax/swing/ScrollPaneLayout.java,
	javax/swing/SizeRequirements.java,
	javax/swing/ViewportLayout.java:
	Made serialVersionUID private.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/peer/gtk/GtkComponentPeer.java:
	Reformatted.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/peer/gtk/GdkGraphics2D.java: More reformatting.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* gnu/java/awt/peer/gtk/GdkGraphics2D.java: Reformatted.

2005-02-15  Jeroen Frijters  <jeroen@frijters.net>

	* java/awt/EventDispatchThread.java,
	java/awt/Toolkit.java:
	Don't catch java.lang.ThreadDeath.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/PasswordView.java
	(drawEchoCharacter): Added javadoc.
	(drawSelectedText): Likewise.
	(drawUnselectedText): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JRootPane.java
	(windowDecorationStyle): New field.
	(setMenuBar): New method.
	(getMenuBar): Likewise.
	(getWindowDecorationStyle): Likewise.
	(setWindowDecorationStyle): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DefaultListSelectionModel.java
	(leadAnchorNotificationEnabled): Made protected.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/InternalFrameFocusTraversalPolicy.java: New file.
	* Makefile.am: Added InternalFrameFocusTraversalPolicy.java.
	* Makefile.in: Regenerated.


2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JFormattedTextField.java: Implemented.
	* javax/swing/JWindow.java
	(JWindow): New constructors.
	(initWindow): Renamed from initFrame.
	* javax/swing/UIDefaults.java
	(ActiveValue): Made interface static.
	(LazyValue): Likewise.
	* javax/swing/plaf/basic/BasicInternalFrameTitlePane.java
	(TitlePaneLayout.TitlePaneLayout): New constructor.
	* javax/swing/plaf/basic/BasicSliderUI.java
	(ChangeHandler): Made public.
	(FocusHandler): Likewise.
	(PropertyChangeHandler): Likewise.
	(ScrollListener): Likewise.
	* javax/swing/plaf/basic/BasicTabbedPaneUI.java
	(FocusHandler): Likewise.
	(MouseHandler): Likewise.
	* javax/swing/plaf/basic/BasicTextPaneUI.java
	(BasicTextPaneUI): Extend BasicEditorPaneUI.
	* javax/swing/plaf/basic/BasicToolBarUI.java
	(BasicToolBarUI): Simplified. Reworked javadoc.
	(canDock): Simplified. Make public.
	(DockingListener): Made public.
	* javax/swing/text/JTextComponent.java
	(navigationFilter): New field.
	(getNavigationFilter): New method.
	(setNavigationFilter): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/plaf/metal/MetalTheme.java
	(getControlTextColor): Return getControlInfo().
	(getHighlightedTextColor): Return getControlTextColor().

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/plaf/basic/BasicButtonListener.java
	(BasicButtonListener): New constructor.
	* javax/swing/plaf/basic/BasicButtonUI.java
	(createButtonListener): Usw new BasicButtonListener constructor.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/imageio/event/package.html,
	javax/imageio/metadata/package.html: New files.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/image/MemoryImageSource.java: Reformatted.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/tree/TreeCellEditor.java: Refomatted.

2005-02-15  Jeroen Frijters  <jeroen@frijters.net>

	* java/awt/color/ICC_Profile.java
	(finalize): Removed pointless field assignments.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/plaf/basic/BasicEditorPaneUI.java: New file.
	* Makefile.am: Added javax/swing/plaf/basic/BasicEditorPaneUI.java.
	* Makefile.in: Regenerated.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/DefaultStyledDocument.java: New file.
	* Makefile.am: Added javax/swing/text/DefaultStyledDocument.java.
	* Makefile.in: Regenerated.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JFileChooser.java
	(showDialog): Return CANCEL_OPTION for now.
	(showOpenDialog): Likewise.
	(showSaveDialog): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JApplet.java
	(HIDE_ON_CLOSE): Removed.
	(EXIT_ON_CLOSE): Likewise.
	(DISPOSE_ON_CLOSE): Likewise.
	(DO_NOTHING_ON_CLOSE): Likewise.
	(close_action): Likewise.
	(getDefaultCloseOperation): Likewise.
	(setDefaultCloseOperation): Likewise.
	(processWindowEvent): Likewise.
	(getPreferredSize): Simplified.
	* javax/swing/JInternalFrame.java
	(setDefaultCloseOperation): Fixed throwing exception on wrong argument
	value.
	* javax/swing/JWindow.java
	(HIDE_ON_CLOSE): Removed.
	(EXIT_ON_CLOSE): Likewise.
	(DISPOSE_ON_CLOSE): Likewise.
	(DO_NOTHING_ON_CLOSE): Likewise.
	(close_action): Likewise.
	(processKeyEvent): Likewise.
	(setDefaultCloseOperation): Likewise.
	(getPreferredSize): Simplified.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTextField.java
	(getPreferredSize): Re-implemented.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JLabel.java
	(setDisplayedMnemonic): Use only upper case characters.
	(setDisplayedMnemonicIndex): Handle index == -1 and fire
	PropertyChangeEvent after property got set to the new index.

2005-02-15  Robert Schuster <thebohemian@gmx.net>

	* javax/swing/JComboBox.java:
	(JComboBox): Removed selection of the
	first item in the model.

2005-02-15  Robert Schuster <thebohemian@gmx.net>

	* javax/swing/JComboBox.java
	added support for no item being selected
	(JComboBox): select first or nothing depending on element count
	(setModel): cleaned up unneeded "this." usage, added more
	docs, made exception behavior match that of the JDK
	(setLighWeightPopupEnabled): removed unneeded "this." usage
	(setEditable): dito
	(setMaximumRowCount): dito
	(setRenderer): dito
	(setPrototypeDisplayValue): dito
	(getSelectedItem): simplified, added more user doc
	(setSelectedIndex): corrected exception behavior, added more user doc
	(getSelectedIndex): fixed hardcoded dependency on DefaultComboBoxModel,
	added performance warning to user doc
	(addItem): fixed exception behavior, added user doc
	(insertItemAt): dito
	(removeItem): dito
	(removeItemAt): dito
	(removeAll): fixed exception behavior, added user doc, added support
	for model not being instance of DefaultComboBoxModel
	(getSelectedItemObjects): simplified
	(getItemCount): fixed dependency on DefaultComboBoxModel
	(getItemAt): fixed dependency on MutableComboBoxModel
	* javax/swing/DefaultComboBoxModel.java:
	(setSelectedItem): updates selected item only if new
	value is null or known (match JDK behavior)
	* javax/swing/plaf/basic/BasicComboBoxUI.java:
	(paintCurrentValue): renders "" if no item is selected

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/plaf/metal/MetalTheme.java,
	javax/swing/plaf/metal/DefaultMetalTheme.java:
	New files.
	* javax/swing/plaf/metal/MetalLookAndFeel.java
	* Makefile.am: Added the new files.
	* Makefile.in: Regenerated.

2005-02-15  Olga Rodimina  <rodimina@redhat.com>

	* javax/swing/JTable.java
	(editorComp): New field.
	(JTable): Initialize local variables and call updateUI
	(selectionBackground): Make protected.
	(selectionForeground): Likewise.
	(initializeLocalVars): Create default editors and renderers,
	initialize editingColumn, editingRow variables.
	(createDefaultEditors): New Method.
	(createDefaultRenderers): Likewise.
	(createDefaultListSelectionModel): Removed
	(createDefaultSelectionModel): New Method.
	(createDefaultTableHeader): Likewise
	(removeColumn): Likewise.
	(getEditingColumn): Likewise.
	(setEditingColumn): Likewise.
	(getEditingRow): Likewise.
	(setEditingRow): Likewise.
	(getEditorComponent): Likewise.
	(isEditing): Likewise.
	(setDefaultEditor): Likewise.
	(addColumnSelectionInterval): Likewise.
	(addRowSelectionInterval): Likewise.
	(setColumnSelectionInterval): Likewise.
	(setRowSelectionInterval): Likewise.
	(removeColumnSelectionInterval): Likewise.
	(removeRowSelectionInterval): Likewise.
 	(isColumnSelected): Likewise.
	(isRowSelected): Likewise.
	(isCellSelected): Likewise.
	(selectAll): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTable.java
	(addColumn): New method.
	(getColumnClass): Likewise.
	(getColumnName): Likewise.

2005-02-15  Paul Jenner  <psj.home@ntlworld.com>

	* javax/swing/TransferHandler.java
	(createTransferable): Made protected.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTable.java,
	javax/swing/plaf/basic/BasicTableHeaderUI.java,
	javax/swing/plaf/basic/BasicTableUI.java:
	Use fixed get/setIntercellSpacing() methods.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTable.java
	(getIntercellSpacing): Fixed typo in method name.
	(setIntercellSpacing): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/JTextComponent.java
	(focusAccelerator): New variable.
	(getFocusAccelerator): New method.
	(setFocusAccelerator): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JComponent.java
	(setTransferHandler): Made public. Fire property change event.
	* javax/swing/TransferHandler.java: Implemented.
	* javax/swing/text/JTextComponent.java
	(DefaultTransferHandler): New inner class.
	(defaultTransferHandler): New variable.
	(copy): New method.
	(cut): Likewise.
	(paste): Likewise.
	(doTransferAction): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTree.java
	(collapsePath): New method.
	(collapseRow): Likewise.
	(expandPath): Likewise.
	(expandRow): Likewise.
	(checkExpandParents): Likewise.
	(doExpandParents): Likewise.
	(setExpandedState): Likewise.
	(makeVisible): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JPasswordField.java: Updated javadocs.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JLayeredPane.java
	(getLayer): Fixed return type, made public.
	(getPosition): Use new getLayer().
	(SetPosition): Likewise.
	(getIndexOf): Likewise.
	(remove): Likewise.
	* javax/swing/JInternalFrame.java
	(getLayer): Use new JLayeredPane.getLayer().


2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/table/TableColumn.java: Added/fixed javadocs over all.
	(setHeaderValue): Simplified. Do nothing when old value == new value.

2005-02-15  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/java/awt/peer/gtk/GdkGraphics.java (setClip): Protect
	against null clip region.
	* gnu/java/awt/peer/gtk/GtkFramePeer.java (create): Call
	gtkWindowSetResizable.
	(postConfigureEvent): Only revalidate if frame size has changed.
	* gnu/java/awt/peer/gtk/GtkWindowPeer.java (postConfigureEvent):
	Only revalidate if frame size has changed.
	* java/awt/Component.java (reshape): Only repaint and post
	component events if component is showing.
	* java/awt/Container.java (addImpl): Only post container event if
	container is showing.
	(remove): Likewise.
	* java/awt/Window.java (setLocationRelativeTo): Implement.
	(setBoundsCallback): Only post component events if component is
	showing.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c (clearRect):
	Protect against null graphics structure.  Flush gdk event queue.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/imageio/ImageReader.java,
	javax/imageio/ImageTranscoder.java,
	javax/imageio/ImageWriter.java,
	javax/imageio/spi/ImageInputStreamSpi.java,
	javax/imageio/spi/ImageOutputStreamSpi.java,
	javax/imageio/spi/ServiceRegistry.java,
	javax/imageio/stream/ImageInputStream.java,
	javax/imageio/stream/ImageOutputStream.java: Updated.
	* javax/imageio/IIOException.java,
	javax/imageio/IIOImage.java,
	javax/imageio/IIOParam.java,
	javax/imageio/IIOParamController.java,
	javax/imageio/ImageIO.java,
	javax/imageio/ImageReadParam.java,
	javax/imageio/ImageTypeSpecifier.java,
	javax/imageio/ImageWriteParam.java,
	javax/imageio/spi/IIORegistry.java,
	javax/imageio/spi/ImageReaderSpi.java,
	javax/imageio/spi/ImageWriterSpi.java,
	javax/imageio/stream/FileCacheImageInputStream.java,
	javax/imageio/stream/FileCacheImageOutputStream.java,
	javax/imageio/stream/FileImageInputStream.java,
	javax/imageio/stream/FileImageOutputStream.java,
	javax/imageio/stream/ImageInputStreamImpl.java,
	javax/imageio/stream/ImageOutputStreamImpl.java,
	javax/imageio/stream/MemoryCacheImageInputStream.java,
	javax/imageio/stream/MemoryCacheImageOutputStream.java,
	javax/imageio/event/IIOReadProgressListener.java,
	javax/imageio/event/IIOReadUpdateListener.java,
	javax/imageio/event/IIOReadWarningListener.java,
	javax/imageio/event/IIOWriteProgressListener.java,
	javax/imageio/event/IIOWriteWarningListener.java,
	javax/imageio/metadata/IIOMetadata.java,
	javax/imageio/metadata/IIOMetadataController.java,
	javax/imageio/metadata/IIOMetadataFormat.java,
	javax/imageio/metadata/IIOInvalidTreeException.java,
	javax/imageio/metadata/IIOMetadataFormatImpl.java,
	javax/imageio/metadata/IIOMetadataNode.java: New files.
	* Makefile.am (javax_source_files): Added new files
	* Makefile.in: Regenerated.

2005-02-15  Graydon Hoare  <graydon@redhat.com>

	* gnu/java/awt/peer/gtk/GdkGraphics2D.java:
	Rework painting into BufferedImages
	* gnu/java/awt/peer/gtk/GdkPixbufDecoder.java:
	Construct BufferedImage with alpha only when alpha is
	present in colormodel.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c:
	Rework painting into client-side jint arrays.
	* jni/gtk-peer/gtkcairopeer.h:
	Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/DefaultListCellRenderer.java
	(serialVersionUID): Made private.
	(getListCellRendererComponent): Set horizontal alignment.
	* javax/swing/JLabel.java
	(setVerticalAlignment): Re-implemented.
	(setHorizontalAlignment): Do nothing if old value = new value.
	* javax/swing/JList.java
	(setCellRenderer): Likewise.
	(setModel): Re-implemented.
	(setSelectionModel): Likewise.

2005-02-15  David Gilbert <david.gilbert@object-refinery.com>

	* java/awt/Component.java,
	java/awt/geom/Rectangle2D.java:
	Javadoc fixes.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/AbstractListModel.java
	(fireContentsChanged): Simplified.
	(fireIntervalAdded): Likewise.
	(fireIntervalRemoved): Likewise.
	* javax/swing/DefaultSingleSelectionModel.java:
	Reformatted.
	(fireStateChanged): Simplified.
	* javax/swing/JPopupMenu.java
	(setSelectionModel): Set property.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/print/Book.java: Reformatted.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* java/awt/geom/Area.java
	(QuadSegment.curveArea): Remove unused variables.
	(CubicSegment.curveArea): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JTree.java
	(ANCHOR_SELECTION_PATH_PROPERTY): Added @since tag.
	(LEAD_SELECTION_PATH_PROPERTY): Likewise.
	(EXPANDS_SELECTED_PATHS_PROPERTY): Likewise.
	(EXPANDED): New constant.
	(COLLAPSED): Likewise.
	(nodeStates): New field.
	(cellEditor): New method.
	(cellRenderer): Likewise.
	(selectionModel): Likewise.
	(treeModel): Likewise.
	(scrollPathToVisible): Likewise.
	(scrollRowToVisible): Likewise.
	(isCollapsed): Likewise.
	(isExpanded): Likewise.
	(clearToggledPaths): Likewise.
	(getDescendantToggledPaths): Likewise.
	(hasBeenExpanded): Likewise.
	(isVisible): Likewise.
	(isPathEditable): Likewise.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JLayeredPane.java: Reformatted.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/tree/DefaultMutableTreeNode.java:
	Completely Revised.
	* javax/swing/tree/MutableTreeNode.java:
	Reformatted.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JFormattedTextField.java
	(setDocument): Call setDocument of super class. Don't fire property
	change event.

2005-02-15  Sven de Marothy  <sven@physto.se>

	* java/awt/image/IndexColorModel.java:
	Add FIXME with respect to alpha handling.
	(getAlpha): Default to returning opaque pixels.
	* java/awt/image/MultiPixelPackedSampleModel.java
	(MultiPixelPackedSampleModel): Corrected parameters, order of
	bit shifts and masks, stride length off by one.

2005-02-15  Michael Koch  <konqueror@gmx.de>

	* javax/swing/JList.java, javax/swing/JTree.java:
	Added much new methods and fixed much methods setting bound properties.

From-SVN: r95115
2005-02-16 20:03:29 +00:00

3055 lines
90 KiB
Java

/* BasicTabbedPaneUI.java --
Copyright (C) 2002, 2004, 2005 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., 59 Temple Place, Suite 330, Boston, MA
02111-1307 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.plaf.basic;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JViewport;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.PanelUI;
import javax.swing.plaf.TabbedPaneUI;
import javax.swing.plaf.UIResource;
import javax.swing.text.View;
/**
* This is the Basic Look and Feel's UI delegate for JTabbedPane.
*/
public class BasicTabbedPaneUI extends TabbedPaneUI implements SwingConstants
{
/**
* A helper class that handles focus.
*/
public class FocusHandler extends FocusAdapter
{
/**
* This method is called when the component gains focus.
*
* @param e The FocusEvent.
*/
public void focusGained(FocusEvent e)
{
// FIXME: Implement.
}
/**
* This method is called when the component loses focus.
*
* @param e The FocusEvent.
*/
public void focusLost(FocusEvent e)
{
// FIXME: Implement.
}
}
/**
* A helper class for determining if mouse presses occur inside tabs and
* sets the index appropriately. In SCROLL_TAB_MODE, this class also
* handles the mouse clicks on the scrolling buttons.
*/
public class MouseHandler extends MouseAdapter
{
/**
* This method is called when the mouse is pressed. The index cannot
* change to a tab that is not enabled.
*
* @param e The MouseEvent.
*/
public void mousePressed(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
int tabCount = tabPane.getTabCount();
if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
{
if (e.getSource() == incrButton)
{
if (++currentScrollLocation >= tabCount)
currentScrollLocation = tabCount - 1;
int width = 0;
for (int i = currentScrollLocation - 1; i < tabCount; i++)
width += rects[i].width;
if (width < viewport.getWidth())
// FIXME: Still getting mouse events after the button is disabled.
// incrButton.setEnabled(false);
currentScrollLocation--;
else if (! decrButton.isEnabled())
decrButton.setEnabled(true);
tabPane.revalidate();
tabPane.repaint();
return;
}
else if (e.getSource() == decrButton)
{
if (--currentScrollLocation < 0)
currentScrollLocation = 0;
if (currentScrollLocation == 0)
decrButton.setEnabled(false);
else if (! incrButton.isEnabled())
incrButton.setEnabled(true);
tabPane.revalidate();
tabPane.repaint();
return;
}
}
int index = tabForCoordinate(tabPane, x, y);
// We need to check since there are areas where tabs cannot be
// e.g. in the inset area.
if (index != -1 && tabPane.isEnabledAt(index))
tabPane.setSelectedIndex(index);
tabPane.revalidate();
tabPane.repaint();
}
}
/**
* This class handles PropertyChangeEvents fired from the JTabbedPane.
*/
public class PropertyChangeHandler implements PropertyChangeListener
{
/**
* This method is called whenever one of the properties of the JTabbedPane
* changes.
*
* @param e The PropertyChangeEvent.
*/
public void propertyChange(PropertyChangeEvent e)
{
if (e.getPropertyName().equals("tabLayoutPolicy"))
{
layoutManager = createLayoutManager();
tabPane.setLayout(layoutManager);
}
else if (e.getPropertyName().equals("tabPlacement")
&& tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
{
incrButton = createIncreaseButton();
decrButton = createDecreaseButton();
}
tabPane.layout();
tabPane.repaint();
}
}
/**
* A LayoutManager responsible for placing all the tabs and the visible
* component inside the JTabbedPane. This class is only used for
* WRAP_TAB_LAYOUT.
*/
protected class TabbedPaneLayout implements LayoutManager
{
/**
* This method is called when a component is added to the JTabbedPane.
*
* @param name The name of the component.
* @param comp The component being added.
*/
public void addLayoutComponent(String name, Component comp)
{
// Do nothing.
}
/**
* This method is called when the rectangles need to be calculated. It
* also fixes the size of the visible component.
*/
public void calculateLayoutInfo()
{
calculateTabRects(tabPane.getTabPlacement(), tabPane.getTabCount());
if (tabPane.getSelectedIndex() != -1)
{
Component visible = getVisibleComponent();
Insets insets = getContentBorderInsets(tabPane.getTabPlacement());
if (visible != null)
visible.setBounds(contentRect.x + insets.left,
contentRect.y + insets.top,
contentRect.width - insets.left - insets.right,
contentRect.height - insets.top - insets.bottom);
}
}
/**
* This method calculates the size of the the JTabbedPane.
*
* @param minimum Whether the JTabbedPane will try to be as small as it
* can.
*
* @return The desired size of the JTabbedPane.
*/
protected Dimension calculateSize(boolean minimum)
{
int tabPlacement = tabPane.getTabPlacement();
int width = 0;
int height = 0;
int componentHeight = 0;
int componentWidth = 0;
Component c;
Dimension dims;
for (int i = 0; i < tabPane.getTabCount(); i++)
{
c = tabPane.getComponentAt(i);
if (c == null)
continue;
calcRect = c.getBounds();
dims = c.getPreferredSize();
if (dims != null)
{
componentHeight = Math.max(componentHeight, dims.height);
componentWidth = Math.max(componentWidth, dims.width);
}
}
Insets insets = tabPane.getInsets();
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
{
int min = calculateMaxTabWidth(tabPlacement);
width = Math.max(min, componentWidth);
int tabAreaHeight = preferredTabAreaHeight(tabPlacement, width);
height = tabAreaHeight + componentHeight;
}
else
{
int min = calculateMaxTabHeight(tabPlacement);
height = Math.max(min, componentHeight);
int tabAreaWidth = preferredTabAreaWidth(tabPlacement, height);
width = tabAreaWidth + componentWidth;
}
return new Dimension(width, height);
}
// if tab placement is LEFT OR RIGHT, they share width.
// if tab placement is TOP OR BOTTOM, they share height
// PRE STEP: finds the default sizes for the labels as well as their locations.
// AND where they will be placed within the run system.
// 1. calls normalizeTab Runs.
// 2. calls rotate tab runs.
// 3. pads the tab runs.
// 4. pads the selected tab.
/**
* This method is called to calculate the tab rectangles. This method
* will calculate the size and position of all rectangles (taking into
* account which ones should be in which tab run). It will pad them and
* normalize them as necessary.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabCount The run the current selection is in.
*/
protected void calculateTabRects(int tabPlacement, int tabCount)
{
if (tabCount == 0)
return;
assureRectsCreated(tabCount);
FontMetrics fm = getFontMetrics();
SwingUtilities.calculateInnerArea(tabPane, calcRect);
Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
Insets insets = tabPane.getInsets();
int max = 0;
int runs = 0;
int start = getTabRunIndent(tabPlacement, 1);
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
{
int maxHeight = calculateMaxTabHeight(tabPlacement);
calcRect.width -= tabAreaInsets.left + tabAreaInsets.right;
max = calcRect.width + tabAreaInsets.left + insets.left;
start += tabAreaInsets.left + insets.left;
int width = 0;
int runWidth = start;
for (int i = 0; i < tabCount; i++)
{
width = calculateTabWidth(tabPlacement, i, fm);
if (runWidth + width > max)
{
runWidth = tabAreaInsets.left + insets.left
+ getTabRunIndent(tabPlacement, ++runs);
rects[i] = new Rectangle(runWidth,
insets.top + tabAreaInsets.top,
width, maxHeight);
runWidth += width;
if (runs > tabRuns.length - 1)
expandTabRunsArray();
tabRuns[runs] = i;
}
else
{
rects[i] = new Rectangle(runWidth,
insets.top + tabAreaInsets.top,
width, maxHeight);
runWidth += width;
}
}
runs++;
tabAreaRect.width = tabPane.getWidth() - insets.left - insets.right;
tabAreaRect.height = runs * maxTabHeight
- (runs - 1) * tabRunOverlay
+ tabAreaInsets.top + tabAreaInsets.bottom;
contentRect.width = tabAreaRect.width;
contentRect.height = tabPane.getHeight() - insets.top
- insets.bottom - tabAreaRect.height;
contentRect.x = insets.left;
tabAreaRect.x = insets.left;
if (tabPlacement == SwingConstants.BOTTOM)
{
contentRect.y = insets.top;
tabAreaRect.y = contentRect.y + contentRect.height;
}
else
{
tabAreaRect.y = insets.top;
contentRect.y = tabAreaRect.y + tabAreaRect.height;
}
}
else
{
int maxWidth = calculateMaxTabWidth(tabPlacement);
calcRect.height -= tabAreaInsets.top + tabAreaInsets.bottom;
max = calcRect.height + tabAreaInsets.top + insets.top;
int height = 0;
start += tabAreaInsets.top + insets.top;
int runHeight = start;
int fontHeight = fm.getHeight();
for (int i = 0; i < tabCount; i++)
{
height = calculateTabHeight(tabPlacement, i, fontHeight);
if (runHeight + height > max)
{
runHeight = tabAreaInsets.top + insets.top
+ getTabRunIndent(tabPlacement, ++runs);
rects[i] = new Rectangle(insets.left + tabAreaInsets.left,
runHeight, maxWidth, height);
runHeight += height;
if (runs > tabRuns.length - 1)
expandTabRunsArray();
tabRuns[runs] = i;
}
else
{
rects[i] = new Rectangle(insets.left + tabAreaInsets.left,
runHeight, maxWidth, height);
runHeight += height;
}
}
runs++;
tabAreaRect.width = runs * maxTabWidth - (runs - 1) * tabRunOverlay
+ tabAreaInsets.left + tabAreaInsets.right;
tabAreaRect.height = tabPane.getHeight() - insets.top
- insets.bottom;
tabAreaRect.y = insets.top;
contentRect.width = tabPane.getWidth() - insets.left - insets.right
- tabAreaRect.width;
contentRect.height = tabAreaRect.height;
contentRect.y = insets.top;
if (tabPlacement == SwingConstants.LEFT)
{
tabAreaRect.x = insets.left;
contentRect.x = tabAreaRect.x + tabAreaRect.width;
}
else
{
contentRect.x = insets.left;
tabAreaRect.x = contentRect.x + contentRect.width;
}
}
runCount = runs;
tabRuns[0] = 0;
normalizeTabRuns(tabPlacement, tabCount, start, max);
selectedRun = getRunForTab(tabCount, tabPane.getSelectedIndex());
if (shouldRotateTabRuns(tabPlacement))
rotateTabRuns(tabPlacement, selectedRun);
// Need to pad the runs and move them to the correct location.
for (int i = 0; i < runCount; i++)
{
int first = lastTabInRun(tabCount, getPreviousTabRun(i)) + 1;
if (first == tabCount)
first = 0;
int last = lastTabInRun(tabCount, i);
if (shouldPadTabRun(tabPlacement, i))
padTabRun(tabPlacement, first, last, max);
// Done padding, now need to move it.
if (tabPlacement == SwingConstants.TOP && i > 0)
{
for (int j = first; j <= last; j++)
rects[j].y += (runCount - i) * maxTabHeight
- (runCount - i) * tabRunOverlay;
}
if (tabPlacement == SwingConstants.BOTTOM)
{
int height = tabPane.getBounds().height - insets.bottom
- tabAreaInsets.bottom;
int adjustment;
if (i == 0)
adjustment = height - maxTabHeight;
else
adjustment = height - (runCount - i + 1) * maxTabHeight
- (runCount - i) * tabRunOverlay;
for (int j = first; j <= last; j++)
rects[j].y = adjustment;
}
if (tabPlacement == SwingConstants.LEFT && i > 0)
{
for (int j = first; j <= last; j++)
rects[j].x += (runCount - i) * maxTabWidth
- (runCount - i) * tabRunOverlay;
}
if (tabPlacement == SwingConstants.RIGHT)
{
int width = tabPane.getBounds().width - insets.right
- tabAreaInsets.right;
int adjustment;
if (i == 0)
adjustment = width - maxTabWidth;
else
adjustment = width - (runCount - i + 1) * maxTabWidth
+ (runCount - i) * tabRunOverlay;
for (int j = first; j <= last; j++)
rects[j].x = adjustment;
}
}
padSelectedTab(tabPlacement, tabPane.getSelectedIndex());
}
/**
* This method is called when the JTabbedPane is laid out in
* WRAP_TAB_LAYOUT. It calls calculateLayoutInfo to find the positions
* of all its components.
*
* @param parent The Container to lay out.
*/
public void layoutContainer(Container parent)
{
calculateLayoutInfo();
}
/**
* This method returns the minimum layout size for the given container.
*
* @param parent The container that is being sized.
*
* @return The minimum size.
*/
public Dimension minimumLayoutSize(Container parent)
{
return calculateSize(false);
}
// If there is more free space in an adjacent run AND the tab in the run can fit in the
// adjacent run, move it. This method is not perfect, it is merely an approximation.
// If you play around with Sun's JTabbedPane, you'll see that
// it does do some pretty strange things with regards to not moving tabs
// that should be moved.
// start = the x position where the tabs will begin
// max = the maximum position of where the tabs can go to (tabAreaInsets.left + the width of the tab area)
/**
* This method tries to "even out" the number of tabs in each run based on
* their widths.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabCount The number of tabs.
* @param start The x position where the tabs will begin.
* @param max The maximum x position where the tab can run to.
*/
protected void normalizeTabRuns(int tabPlacement, int tabCount, int start,
int max)
{
Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
if (tabPlacement == SwingUtilities.TOP
|| tabPlacement == SwingUtilities.BOTTOM)
{
// We should only do this for runCount - 1, cause we can only shift that many times between
// runs.
for (int i = 1; i < runCount; i++)
{
Rectangle currRun = rects[lastTabInRun(tabCount, i)];
Rectangle nextRun = rects[lastTabInRun(tabCount, getNextTabRun(i))];
int spaceInCurr = currRun.x + currRun.width;
int spaceInNext = nextRun.x + nextRun.width;
int diffNow = spaceInCurr - spaceInNext;
int diffLater = (spaceInCurr - currRun.width)
- (spaceInNext + currRun.width);
while (Math.abs(diffLater) < Math.abs(diffNow)
&& spaceInNext + currRun.width < max)
{
tabRuns[i]--;
spaceInNext += currRun.width;
spaceInCurr -= currRun.width;
currRun = rects[lastTabInRun(tabCount, i)];
diffNow = spaceInCurr - spaceInNext;
diffLater = (spaceInCurr - currRun.width)
- (spaceInNext + currRun.width);
}
// Fix the bounds.
int first = lastTabInRun(tabCount, i) + 1;
int last = lastTabInRun(tabCount, getNextTabRun(i));
int currX = tabAreaInsets.left;
for (int j = first; j <= last; j++)
{
rects[j].x = currX;
currX += rects[j].width;
}
}
}
else
{
for (int i = 1; i < runCount; i++)
{
Rectangle currRun = rects[lastTabInRun(tabCount, i)];
Rectangle nextRun = rects[lastTabInRun(tabCount, getNextTabRun(i))];
int spaceInCurr = currRun.y + currRun.height;
int spaceInNext = nextRun.y + nextRun.height;
int diffNow = spaceInCurr - spaceInNext;
int diffLater = (spaceInCurr - currRun.height)
- (spaceInNext + currRun.height);
while (Math.abs(diffLater) < Math.abs(diffNow)
&& spaceInNext + currRun.height < max)
{
tabRuns[i]--;
spaceInNext += currRun.height;
spaceInCurr -= currRun.height;
currRun = rects[lastTabInRun(tabCount, i)];
diffNow = spaceInCurr - spaceInNext;
diffLater = (spaceInCurr - currRun.height)
- (spaceInNext + currRun.height);
}
int first = lastTabInRun(tabCount, i) + 1;
int last = lastTabInRun(tabCount, getNextTabRun(i));
int currY = tabAreaInsets.top;
for (int j = first; j <= last; j++)
{
rects[j].y = currY;
currY += rects[j].height;
}
}
}
}
/**
* This method pads the tab at the selected index by the selected tab pad
* insets (so that it looks larger).
*
* @param tabPlacement The placement of the tabs.
* @param selectedIndex The selected index.
*/
protected void padSelectedTab(int tabPlacement, int selectedIndex)
{
Insets insets = getSelectedTabPadInsets(tabPlacement);
rects[selectedIndex].x -= insets.left;
rects[selectedIndex].y -= insets.top;
rects[selectedIndex].width += insets.left + insets.right;
rects[selectedIndex].height += insets.top + insets.bottom;
}
// If the tabs on the run don't fill the width of the window, make it fit now.
// start = starting index of the run
// end = last index of the run
// max = tabAreaInsets.left + width (or equivalent)
// assert start <= end.
/**
* This method makes each tab in the run larger so that the tabs expand
* to fill the runs width/height (depending on tabPlacement).
*
* @param tabPlacement The placement of the tabs.
* @param start The index of the first tab.
* @param end The last index of the tab
* @param max The amount of space in the run (width for TOP and BOTTOM
* tabPlacement).
*/
protected void padTabRun(int tabPlacement, int start, int end, int max)
{
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
{
int runWidth = rects[end].x + rects[end].width;
int spaceRemaining = max - runWidth;
int numTabs = end - start + 1;
// now divvy up the space.
int spaceAllocated = spaceRemaining / numTabs;
int currX = rects[start].x;
for (int i = start; i <= end; i++)
{
rects[i].x = currX;
rects[i].width += spaceAllocated;
currX += rects[i].width;
// This is used because since the spaceAllocated
// variable is an int, it rounds down. Sometimes,
// we don't fill an entire row, so we make it do
// so now.
if (i == end && rects[i].x + rects[i].width != max)
rects[i].width = max - rects[i].x;
}
}
else
{
int runHeight = rects[end].y + rects[end].height;
int spaceRemaining = max - runHeight;
int numTabs = end - start + 1;
int spaceAllocated = spaceRemaining / numTabs;
int currY = rects[start].y;
for (int i = start; i <= end; i++)
{
rects[i].y = currY;
rects[i].height += spaceAllocated;
currY += rects[i].height;
if (i == end && rects[i].y + rects[i].height != max)
rects[i].height = max - rects[i].y;
}
}
}
/**
* This method returns the preferred layout size for the given container.
*
* @param parent The container to size.
*
* @return The preferred layout size.
*/
public Dimension preferredLayoutSize(Container parent)
{
return calculateSize(false);
}
/**
* This method returns the preferred tab height given a tabPlacement and
* width.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param width The expected width.
*
* @return The preferred tab area height.
*/
protected int preferredTabAreaHeight(int tabPlacement, int width)
{
if (tabPane.getTabCount() == 0)
return calculateTabAreaHeight(tabPlacement, 0, 0);
int runs = 0;
int runWidth = 0;
int tabWidth = 0;
FontMetrics fm = getFontMetrics();
Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
Insets insets = tabPane.getInsets();
// Only interested in width, this is a messed up rectangle now.
width -= tabAreaInsets.left + tabAreaInsets.right + insets.left
+ insets.right;
// The reason why we can't use runCount:
// This method is only called to calculate the size request
// for the tabbedPane. However, this size request is dependent on
// our desired width. We need to find out what the height would
// be IF we got our desired width.
for (int i = 0; i < tabPane.getTabCount(); i++)
{
tabWidth = calculateTabWidth(tabPlacement, i, fm);
if (runWidth + tabWidth > width)
{
runWidth = tabWidth;
runs++;
}
else
runWidth += tabWidth;
}
runs++;
int maxTabHeight = calculateMaxTabHeight(tabPlacement);
int tabAreaHeight = calculateTabAreaHeight(tabPlacement, runs,
maxTabHeight);
return tabAreaHeight;
}
/**
* This method calculates the preferred tab area width given a tab
* placement and height.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param height The expected height.
*
* @return The preferred tab area width.
*/
protected int preferredTabAreaWidth(int tabPlacement, int height)
{
if (tabPane.getTabCount() == 0)
return calculateTabAreaHeight(tabPlacement, 0, 0);
int runs = 0;
int runHeight = 0;
int tabHeight = 0;
FontMetrics fm = getFontMetrics();
Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
Insets insets = tabPane.getInsets();
height -= tabAreaInsets.top + tabAreaInsets.bottom + insets.top
+ insets.bottom;
int fontHeight = fm.getHeight();
for (int i = 0; i < tabPane.getTabCount(); i++)
{
tabHeight = calculateTabHeight(tabPlacement, i, fontHeight);
if (runHeight + tabHeight > height)
{
runHeight = tabHeight;
runs++;
}
else
runHeight += tabHeight;
}
runs++;
int maxTabWidth = calculateMaxTabWidth(tabPlacement);
int tabAreaWidth = calculateTabAreaWidth(tabPlacement, runs, maxTabWidth);
return tabAreaWidth;
}
/**
* This method rotates the places each run in the correct place the
* tabRuns array. See the comment for tabRuns for how the runs are placed
* in the array.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param selectedRun The run the current selection is in.
*/
protected void rotateTabRuns(int tabPlacement, int selectedRun)
{
if (runCount == 1 || selectedRun == 1 || selectedRun == -1)
return;
int[] newTabRuns = new int[tabRuns.length];
int currentRun = selectedRun;
int i = 1;
do
{
newTabRuns[i] = tabRuns[currentRun];
currentRun = getNextTabRun(currentRun);
i++;
}
while (i < runCount);
if (runCount > 1)
newTabRuns[0] = tabRuns[currentRun];
tabRuns = newTabRuns;
BasicTabbedPaneUI.this.selectedRun = 1;
}
/**
* This method is called when a component is removed from the
* JTabbedPane.
*
* @param comp The component removed.
*/
public void removeLayoutComponent(Component comp)
{
// Do nothing.
}
}
/**
* This class acts as the LayoutManager for the JTabbedPane in
* SCROLL_TAB_MODE.
*/
private class TabbedPaneScrollLayout extends TabbedPaneLayout
{
/**
* This method returns the preferred layout size for the given container.
*
* @param parent The container to calculate a size for.
*
* @return The preferred layout size.
*/
public Dimension preferredLayoutSize(Container parent)
{
return super.calculateSize(true);
}
/**
* This method returns the minimum layout size for the given container.
*
* @param parent The container to calculate a size for.
*
* @return The minimum layout size.
*/
public Dimension minimumLayoutSize(Container parent)
{
return super.calculateSize(true);
}
/**
* This method calculates the tab area height given a desired width.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param width The expected width.
*
* @return The tab area height given the width.
*/
protected int preferredTabAreaHeight(int tabPlacement, int width)
{
if (tabPane.getTabCount() == 0)
return calculateTabAreaHeight(tabPlacement, 0, 0);
int runs = 1;
int maxTabHeight = calculateMaxTabHeight(tabPlacement);
int tabAreaHeight = calculateTabAreaHeight(tabPlacement, runs,
maxTabHeight);
return tabAreaHeight;
}
/**
* This method calculates the tab area width given a desired height.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param height The expected height.
*
* @return The tab area width given the height.
*/
protected int preferredTabAreaWidth(int tabPlacement, int height)
{
if (tabPane.getTabCount() == 0)
return calculateTabAreaHeight(tabPlacement, 0, 0);
int runs = 1;
int maxTabWidth = calculateMaxTabWidth(tabPlacement);
int tabAreaWidth = calculateTabAreaWidth(tabPlacement, runs, maxTabWidth);
return tabAreaWidth;
}
/**
* This method is called to calculate the tab rectangles. This method
* will calculate the size and position of all rectangles (taking into
* account which ones should be in which tab run). It will pad them and
* normalize them as necessary.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabCount The number of tabs.
*/
protected void calculateTabRects(int tabPlacement, int tabCount)
{
if (tabCount == 0)
return;
assureRectsCreated(tabCount);
FontMetrics fm = getFontMetrics();
SwingUtilities.calculateInnerArea(tabPane, calcRect);
Insets tabAreaInsets = getTabAreaInsets(tabPlacement);
Insets insets = tabPane.getInsets();
int max = 0;
int runs = 1;
int start = 0;
int top = 0;
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
{
int maxHeight = calculateMaxTabHeight(tabPlacement);
calcRect.width -= tabAreaInsets.left + tabAreaInsets.right;
max = calcRect.width + tabAreaInsets.left + insets.left;
start = tabAreaInsets.left + insets.left;
int width = 0;
int runWidth = start;
top = insets.top + tabAreaInsets.top;
for (int i = 0; i < tabCount; i++)
{
width = calculateTabWidth(tabPlacement, i, fm);
rects[i] = new Rectangle(runWidth, top, width, maxHeight);
runWidth += width;
}
tabAreaRect.width = tabPane.getWidth() - insets.left - insets.right;
tabAreaRect.height = runs * maxTabHeight
- (runs - 1) * tabRunOverlay
+ tabAreaInsets.top + tabAreaInsets.bottom;
contentRect.width = tabAreaRect.width;
contentRect.height = tabPane.getHeight() - insets.top
- insets.bottom - tabAreaRect.height;
contentRect.x = insets.left;
tabAreaRect.x = insets.left;
if (tabPlacement == SwingConstants.BOTTOM)
{
contentRect.y = insets.top;
tabAreaRect.y = contentRect.y + contentRect.height;
}
else
{
tabAreaRect.y = insets.top;
contentRect.y = tabAreaRect.y + tabAreaRect.height;
}
}
else
{
int maxWidth = calculateMaxTabWidth(tabPlacement);
calcRect.height -= tabAreaInsets.top + tabAreaInsets.bottom;
max = calcRect.height + tabAreaInsets.top;
int height = 0;
start = tabAreaInsets.top + insets.top;
int runHeight = start;
int fontHeight = fm.getHeight();
top = insets.left + tabAreaInsets.left;
for (int i = 0; i < tabCount; i++)
{
height = calculateTabHeight(tabPlacement, i, fontHeight);
rects[i] = new Rectangle(top, runHeight, maxWidth, height);
runHeight += height;
}
tabAreaRect.width = runs * maxTabWidth - (runs - 1) * tabRunOverlay
+ tabAreaInsets.left + tabAreaInsets.right;
tabAreaRect.height = tabPane.getHeight() - insets.top
- insets.bottom;
tabAreaRect.y = insets.top;
contentRect.width = tabPane.getWidth() - insets.left - insets.right
- tabAreaRect.width;
contentRect.height = tabAreaRect.height;
contentRect.y = insets.top;
if (tabPlacement == SwingConstants.LEFT)
{
tabAreaRect.x = insets.left;
contentRect.x = tabAreaRect.x + tabAreaRect.width;
}
else
{
contentRect.x = insets.left;
tabAreaRect.x = contentRect.x + contentRect.width;
}
}
runCount = runs;
padSelectedTab(tabPlacement, tabPane.getSelectedIndex());
}
/**
* This method is called when the JTabbedPane is laid out in
* SCROLL_TAB_LAYOUT. It finds the position for all components in the
* JTabbedPane.
*
* @param pane The JTabbedPane to be laid out.
*/
public void layoutContainer(Container pane)
{
super.layoutContainer(pane);
int tabCount = tabPane.getTabCount();
Point p = null;
if (tabCount == 0)
return;
int tabPlacement = tabPane.getTabPlacement();
incrButton.hide();
decrButton.hide();
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
{
if (tabAreaRect.x + tabAreaRect.width < rects[tabCount - 1].x
+ rects[tabCount - 1].width)
{
Dimension incrDims = incrButton.getPreferredSize();
Dimension decrDims = decrButton.getPreferredSize();
decrButton.setBounds(tabAreaRect.x + tabAreaRect.width
- incrDims.width - decrDims.width,
tabAreaRect.y, decrDims.width,
tabAreaRect.height);
incrButton.setBounds(tabAreaRect.x + tabAreaRect.width
- incrDims.width, tabAreaRect.y,
decrDims.width, tabAreaRect.height);
tabAreaRect.width -= decrDims.width + incrDims.width;
incrButton.show();
decrButton.show();
}
}
if (tabPlacement == SwingConstants.LEFT
|| tabPlacement == SwingConstants.RIGHT)
{
if (tabAreaRect.y + tabAreaRect.height < rects[tabCount - 1].y
+ rects[tabCount - 1].height)
{
Dimension incrDims = incrButton.getPreferredSize();
Dimension decrDims = decrButton.getPreferredSize();
decrButton.setBounds(tabAreaRect.x,
tabAreaRect.y + tabAreaRect.height
- incrDims.height - decrDims.height,
tabAreaRect.width, decrDims.height);
incrButton.setBounds(tabAreaRect.x,
tabAreaRect.y + tabAreaRect.height
- incrDims.height, tabAreaRect.width,
incrDims.height);
tabAreaRect.height -= decrDims.height + incrDims.height;
incrButton.show();
decrButton.show();
}
}
viewport.setBounds(tabAreaRect.x, tabAreaRect.y, tabAreaRect.width,
tabAreaRect.height);
int tabC = tabPane.getTabCount() - 1;
if (tabCount > 0)
{
int w = Math.max(rects[tabC].width + rects[tabC].x, tabAreaRect.width);
int h = Math.max(rects[tabC].height, tabAreaRect.height);
p = findPointForIndex(currentScrollLocation);
// we want to cover that entire space so that borders that run under
// the tab area don't show up when we move the viewport around.
panel.setSize(w + p.x, h + p.y);
}
viewport.setViewPosition(p);
viewport.repaint();
}
}
/**
* This class handles ChangeEvents from the JTabbedPane.
*/
public class TabSelectionHandler implements ChangeListener
{
/**
* This method is called whenever a ChangeEvent is fired from the
* JTabbedPane.
*
* @param e The ChangeEvent fired.
*/
public void stateChanged(ChangeEvent e)
{
selectedRun = getRunForTab(tabPane.getTabCount(),
tabPane.getSelectedIndex());
tabPane.revalidate();
tabPane.repaint();
}
}
/**
* This helper class is a JPanel that fits inside the ScrollViewport. This
* panel's sole job is to paint the tab rectangles inside the viewport so
* that it's clipped correctly.
*/
private class ScrollingPanel extends JPanel
{
/**
* This is a private UI class for our panel.
*/
private class ScrollingPanelUI extends BasicPanelUI
{
/**
* This method overrides the default paint method. It paints the tab
* rectangles for the JTabbedPane in the panel.
*
* @param g The Graphics object to paint with.
* @param c The JComponent to paint.
*/
public void paint(Graphics g, JComponent c)
{
paintTabArea(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex());
}
}
/**
* This method overrides the updateUI method. It makes the default UI for
* this ScrollingPanel to be a ScrollingPanelUI.
*/
public void updateUI()
{
setUI((PanelUI) new ScrollingPanelUI());
}
}
/**
* This is a helper class that paints the panel that paints tabs. This
* custom JViewport is used so that the tabs painted in the panel will be
* clipped. This class implements UIResource so tabs are not added when
* this objects of this class are added to the JTabbedPane.
*/
private class ScrollingViewport extends JViewport implements UIResource
{
}
/**
* This is a helper class that implements UIResource so it is not added as a
* tab when an object of this class is added to the JTabbedPane.
*/
private static class ScrollingButton extends BasicArrowButton
implements UIResource
{
/**
* Creates a ScrollingButton given the direction.
*
* @param dir The direction to point in.
*/
public ScrollingButton(int dir)
{
super(dir);
}
}
/** The button that increments the current scroll location. */
private transient ScrollingButton incrButton;
/** The button that decrements the current scroll location. */
private transient ScrollingButton decrButton;
/** The viewport used to display the tabs. */
private transient ScrollingViewport viewport;
/** The panel inside the viewport that paints the tabs. */
private transient ScrollingPanel panel;
/** The starting visible tab in the run in SCROLL_TAB_MODE. */
private transient int currentScrollLocation;
/** A reusable rectangle. */
protected Rectangle calcRect;
/** An array of Rectangles keeping track of the tabs' area and position. */
protected Rectangle[] rects;
/** The insets around the content area. */
protected Insets contentBorderInsets;
/** The extra insets around the selected tab. */
protected Insets selectedTabPadInsets;
/** The insets around the tab area. */
protected Insets tabAreaInsets;
/** The insets around each and every tab. */
protected Insets tabInsets;
/**
* The outer bottom and right edge color for both the tab and content
* border.
*/
protected Color darkShadow;
/** The color of the focus outline on the selected tab. */
protected Color focus;
/** FIXME: find a use for this. */
protected Color highlight;
/** The top and left edge color for both the tab and content border. */
protected Color lightHighlight;
/** The inner bottom and right edge color for the tab and content border. */
protected Color shadow;
/** The maximum tab height. */
protected int maxTabHeight;
/** The maximum tab width. */
protected int maxTabWidth;
/** The number of runs in the JTabbedPane. */
protected int runCount;
/** The index of the run that the selected index is in. */
protected int selectedRun;
/** The amount of space each run overlaps the previous by. */
protected int tabRunOverlay;
/** The gap between text and label */
protected int textIconGap;
// Keeps track of tab runs.
// The organization of this array is as follows (lots of experimentation to
// figure this out)
// index 0 = furthest away from the component area (aka outer run)
// index 1 = closest to component area (aka selected run)
// index > 1 = listed in order leading from selected run to outer run.
// each int in the array is the tab index + 1 (counting starts at 1)
// for the last tab in the run. (same as the rects array)
/** This array keeps track of which tabs are in which run. See above. */
protected int[] tabRuns;
/**
* This is the keystroke for moving down.
*
* @deprecated 1.3
*/
protected KeyStroke downKey;
/**
* This is the keystroke for moving left.
*
* @deprecated 1.3
*/
protected KeyStroke leftKey;
/**
* This is the keystroke for moving right.
*
* @deprecated 1.3
*/
protected KeyStroke rightKey;
/**
* This is the keystroke for moving up.
*
* @deprecated 1.3
*/
protected KeyStroke upKey;
/** The listener that listens for focus events. */
protected FocusListener focusListener;
/** The listener that listens for mouse events. */
protected MouseListener mouseListener;
/** The listener that listens for property change events. */
protected PropertyChangeListener propertyChangeListener;
/** The listener that listens for change events. */
protected ChangeListener tabChangeListener;
/** The tab pane that this UI paints. */
protected JTabbedPane tabPane;
/** The current layout manager for the tabPane. */
private transient LayoutManager layoutManager;
/** The rectangle that describes the tab area's position and size. */
private transient Rectangle tabAreaRect;
/** The rectangle that describes the content area's position and size. */
private transient Rectangle contentRect;
/**
* Creates a new BasicTabbedPaneUI object.
*/
public BasicTabbedPaneUI()
{
super();
}
/**
* This method creates a ScrollingButton that points in the appropriate
* direction for an increasing button.
*
* @return The increase ScrollingButton.
*/
private ScrollingButton createIncreaseButton()
{
if (incrButton == null)
incrButton = new ScrollingButton(SwingConstants.NORTH);
if (tabPane.getTabPlacement() == SwingConstants.TOP
|| tabPane.getTabPlacement() == SwingConstants.BOTTOM)
incrButton.setDirection(SwingConstants.EAST);
else
incrButton.setDirection(SwingConstants.SOUTH);
return incrButton;
}
/**
* This method creates a ScrollingButton that points in the appropriate
* direction for a decreasing button.
*
* @return The decrease ScrollingButton.
*/
private ScrollingButton createDecreaseButton()
{
if (decrButton == null)
decrButton = new ScrollingButton(SwingConstants.SOUTH);
if (tabPane.getTabPlacement() == SwingConstants.TOP
|| tabPane.getTabPlacement() == SwingConstants.BOTTOM)
decrButton.setDirection(SwingConstants.WEST);
else
decrButton.setDirection(SwingConstants.NORTH);
return decrButton;
}
/**
* This method finds the point to set the view position at given the index
* of a tab. The tab will be the first visible tab in the run.
*
* @param index The index of the first visible tab.
*
* @return The position of the first visible tab.
*/
private Point findPointForIndex(int index)
{
int tabPlacement = tabPane.getTabPlacement();
int selectedIndex = tabPane.getSelectedIndex();
Insets insets = getSelectedTabPadInsets(tabPlacement);
int w = 0;
int h = 0;
if (tabPlacement == TOP || tabPlacement == BOTTOM)
{
if (index > 0)
{
w += rects[index - 1].x + rects[index - 1].width;
if (index > selectedIndex)
w -= insets.left + insets.right;
}
}
else
{
if (index > 0)
{
h += rects[index - 1].y + rects[index - 1].height;
if (index > selectedIndex)
h -= insets.top + insets.bottom;
}
}
Point p = new Point(w, h);
return p;
}
/**
* This method creates a new BasicTabbedPaneUI.
*
* @param c The JComponent to create a UI for.
*
* @return A new BasicTabbedPaneUI.
*/
public static ComponentUI createUI(JComponent c)
{
return new BasicTabbedPaneUI();
}
/**
* This method installs the UI for the given JComponent.
*
* @param c The JComponent to install the UI for.
*/
public void installUI(JComponent c)
{
super.installUI(c);
if (c instanceof JTabbedPane)
{
tabPane = (JTabbedPane) c;
installComponents();
installDefaults();
installListeners();
installKeyboardActions();
layoutManager = createLayoutManager();
tabPane.setLayout(layoutManager);
tabPane.layout();
}
}
/**
* This method uninstalls the UI for the given JComponent.
*
* @param c The JComponent to uninstall the UI for.
*/
public void uninstallUI(JComponent c)
{
layoutManager = null;
uninstallKeyboardActions();
uninstallListeners();
uninstallDefaults();
uninstallComponents();
tabPane = null;
}
/**
* This method creates the appropriate layout manager for the JTabbedPane's
* current tab layout policy. If the tab layout policy is
* SCROLL_TAB_LAYOUT, then all the associated components that need to be
* created will be done so now.
*
* @return A layout manager given the tab layout policy.
*/
protected LayoutManager createLayoutManager()
{
if (tabPane.getTabLayoutPolicy() == JTabbedPane.WRAP_TAB_LAYOUT)
return new TabbedPaneLayout();
else
{
incrButton = createIncreaseButton();
decrButton = createDecreaseButton();
viewport = new ScrollingViewport();
viewport.setLayout(null);
panel = new ScrollingPanel();
viewport.setView(panel);
tabPane.add(incrButton);
tabPane.add(decrButton);
tabPane.add(viewport);
currentScrollLocation = 0;
decrButton.setEnabled(false);
panel.addMouseListener(mouseListener);
incrButton.addMouseListener(mouseListener);
decrButton.addMouseListener(mouseListener);
viewport.setBackground(Color.LIGHT_GRAY);
return new TabbedPaneScrollLayout();
}
}
/**
* This method installs components for this JTabbedPane.
*/
protected void installComponents()
{
// Nothing to be done.
}
/**
* This method uninstalls components for this JTabbedPane.
*/
protected void uninstallComponents()
{
// Nothing to be done.
}
/**
* This method installs defaults for the Look and Feel.
*/
protected void installDefaults()
{
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
tabPane.setFont(defaults.getFont("TabbedPane.font"));
tabPane.setForeground(defaults.getColor("TabbedPane.foreground"));
tabPane.setBackground(defaults.getColor("TabbedPane.background"));
tabPane.setOpaque(true);
highlight = defaults.getColor("TabbedPane.highlight");
lightHighlight = defaults.getColor("TabbedPane.lightHighlight");
shadow = defaults.getColor("TabbedPane.shadow");
darkShadow = defaults.getColor("TabbedPane.darkShadow");
focus = defaults.getColor("TabbedPane.focus");
textIconGap = defaults.getInt("TabbedPane.textIconGap");
tabRunOverlay = defaults.getInt("TabbedPane.tabRunOverlay");
tabInsets = defaults.getInsets("TabbedPane.tabbedPaneTabInsets");
selectedTabPadInsets = defaults.getInsets("TabbedPane.tabbedPaneTabPadInsets");
tabAreaInsets = defaults.getInsets("TabbedPane.tabbedPaneTabAreaInsets");
contentBorderInsets = defaults.getInsets("TabbedPane.tabbedPaneContentBorderInsets");
calcRect = new Rectangle();
tabRuns = new int[10];
tabAreaRect = new Rectangle();
contentRect = new Rectangle();
}
/**
* This method uninstalls defaults for the Look and Feel.
*/
protected void uninstallDefaults()
{
calcRect = null;
tabAreaRect = null;
contentRect = null;
tabRuns = null;
contentBorderInsets = null;
tabAreaInsets = null;
selectedTabPadInsets = null;
tabInsets = null;
focus = null;
darkShadow = null;
shadow = null;
lightHighlight = null;
highlight = null;
tabPane.setBackground(null);
tabPane.setForeground(null);
tabPane.setFont(null);
}
/**
* This method creates and installs the listeners for this UI.
*/
protected void installListeners()
{
mouseListener = createMouseListener();
tabChangeListener = createChangeListener();
propertyChangeListener = createPropertyChangeListener();
focusListener = createFocusListener();
tabPane.addMouseListener(mouseListener);
tabPane.addChangeListener(tabChangeListener);
tabPane.addPropertyChangeListener(propertyChangeListener);
tabPane.addFocusListener(focusListener);
}
/**
* This method removes and nulls the listeners for this UI.
*/
protected void uninstallListeners()
{
tabPane.removeFocusListener(focusListener);
tabPane.removePropertyChangeListener(propertyChangeListener);
tabPane.removeChangeListener(tabChangeListener);
tabPane.removeMouseListener(mouseListener);
focusListener = null;
propertyChangeListener = null;
tabChangeListener = null;
mouseListener = null;
}
/**
* This method creates a new MouseListener.
*
* @return A new MouseListener.
*/
protected MouseListener createMouseListener()
{
return new MouseHandler();
}
/**
* This method creates a new FocusListener.
*
* @return A new FocusListener.
*/
protected FocusListener createFocusListener()
{
return new FocusHandler();
}
/**
* This method creates a new ChangeListener.
*
* @return A new ChangeListener.
*/
protected ChangeListener createChangeListener()
{
return new TabSelectionHandler();
}
/**
* This method creates a new PropertyChangeListener.
*
* @return A new PropertyChangeListener.
*/
protected PropertyChangeListener createPropertyChangeListener()
{
return new PropertyChangeHandler();
}
/**
* This method installs keyboard actions for the JTabbedPane.
*/
protected void installKeyboardActions()
{
// FIXME: Implement.
}
/**
* This method uninstalls keyboard actions for the JTabbedPane.
*/
protected void uninstallKeyboardActions()
{
// FIXME: Implement.
}
/**
* This method returns the preferred size of the JTabbedPane.
*
* @param c The JComponent to find a size for.
*
* @return The preferred size.
*/
public Dimension getPreferredSize(JComponent c)
{
return layoutManager.preferredLayoutSize(tabPane);
}
/**
* This method returns the minimum size of the JTabbedPane.
*
* @param c The JComponent to find a size for.
*
* @return The minimum size.
*/
public Dimension getMinimumSize(JComponent c)
{
return layoutManager.minimumLayoutSize(tabPane);
}
/**
* This method returns the maximum size of the JTabbedPane.
*
* @param c The JComponent to find a size for.
*
* @return The maximum size.
*/
public Dimension getMaximumSize(JComponent c)
{
return getPreferredSize(c);
}
/**
* This method paints the JTabbedPane.
*
* @param g The Graphics object to paint with.
* @param c The JComponent to paint.
*/
public void paint(Graphics g, JComponent c)
{
if (tabPane.getTabCount() == 0)
return;
if (tabPane.getTabLayoutPolicy() == JTabbedPane.WRAP_TAB_LAYOUT)
paintTabArea(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex());
paintContentBorder(g, tabPane.getTabPlacement(), tabPane.getSelectedIndex());
}
/**
* This method paints the tab area. This includes painting the rectangles
* that make up the tabs.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param selectedIndex The selected index.
*/
protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex)
{
Rectangle ir = new Rectangle();
Rectangle tr = new Rectangle();
boolean isScroll = tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT;
// Please note: the ordering of the painting is important.
// we WANT to paint the outermost run first and then work our way in.
int tabCount = tabPane.getTabCount();
int currRun = 1;
if (tabCount < 1)
return;
if (runCount > 1)
currRun = 0;
for (int i = 0; i < runCount; i++)
{
int first = lastTabInRun(tabCount, getPreviousTabRun(currRun)) + 1;
if (isScroll)
first = currentScrollLocation;
else if (first == tabCount)
first = 0;
int last = lastTabInRun(tabCount, currRun);
if (isScroll)
{
for (int k = first; k < tabCount; k++)
{
if (rects[k].x + rects[k].width - rects[first].x > viewport
.getWidth())
{
last = k;
break;
}
}
}
for (int j = first; j <= last; j++)
{
if (j != selectedIndex || isScroll)
paintTab(g, tabPlacement, rects, j, ir, tr);
}
currRun = getPreviousTabRun(currRun);
}
if (! isScroll)
paintTab(g, tabPlacement, rects, selectedIndex, ir, tr);
}
/**
* This method paints an individual tab.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param rects The array of rectangles that keep the size and position of
* the tabs.
* @param tabIndex The tab index to paint.
* @param iconRect The rectangle to use for the icon.
* @param textRect The rectangle to use for the text.
*/
protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects,
int tabIndex, Rectangle iconRect, Rectangle textRect)
{
FontMetrics fm = getFontMetrics();
Icon icon = getIconForTab(tabIndex);
String title = tabPane.getTitleAt(tabIndex);
boolean isSelected = tabIndex == tabPane.getSelectedIndex();
calcRect = getTabBounds(tabPane, tabIndex);
int x = calcRect.x;
int y = calcRect.y;
int w = calcRect.width;
int h = calcRect.height;
if (getRunForTab(tabPane.getTabCount(), tabIndex) == 1)
{
Insets insets = getTabAreaInsets(tabPlacement);
switch (tabPlacement)
{
case TOP:
h += insets.bottom;
break;
case LEFT:
w += insets.right;
break;
case BOTTOM:
y -= insets.top;
h += insets.top;
break;
case RIGHT:
x -= insets.left;
w += insets.left;
break;
}
}
layoutLabel(tabPlacement, fm, tabIndex, title, icon, calcRect, iconRect,
textRect, isSelected);
paintTabBackground(g, tabPlacement, tabIndex, x, y, w, h, isSelected);
paintTabBorder(g, tabPlacement, tabIndex, x, y, w, h, isSelected);
// FIXME: Paint little folding corner and jagged edge clipped tab.
if (icon != null)
paintIcon(g, tabPlacement, tabIndex, icon, iconRect, isSelected);
if (title != null && ! title.equals(""))
paintText(g, tabPlacement, tabPane.getFont(), fm, tabIndex, title,
textRect, isSelected);
}
/**
* This method lays out the tab and finds the location to paint the icon
* and text.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param metrics The font metrics for the font to paint with.
* @param tabIndex The tab index to paint.
* @param title The string painted.
* @param icon The icon painted.
* @param tabRect The tab bounds.
* @param iconRect The calculated icon bounds.
* @param textRect The calculated text bounds.
* @param isSelected Whether this tab is selected.
*/
protected void layoutLabel(int tabPlacement, FontMetrics metrics,
int tabIndex, String title, Icon icon,
Rectangle tabRect, Rectangle iconRect,
Rectangle textRect, boolean isSelected)
{
SwingUtilities.layoutCompoundLabel(metrics, title, icon,
SwingConstants.CENTER,
SwingConstants.CENTER,
SwingConstants.CENTER,
SwingConstants.CENTER, tabRect,
iconRect, textRect, textIconGap);
int shiftX = getTabLabelShiftX(tabPlacement, tabIndex, isSelected);
int shiftY = getTabLabelShiftY(tabPlacement, tabIndex, isSelected);
iconRect.x += shiftX;
iconRect.y += shiftY;
textRect.x += shiftX;
textRect.y += shiftY;
}
/**
* This method paints the icon.
*
* @param g The Graphics object to paint.
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The tab index to paint.
* @param icon The icon to paint.
* @param iconRect The bounds of the icon.
* @param isSelected Whether this tab is selected.
*/
protected void paintIcon(Graphics g, int tabPlacement, int tabIndex,
Icon icon, Rectangle iconRect, boolean isSelected)
{
icon.paintIcon(tabPane, g, iconRect.x, iconRect.y);
}
/**
* This method paints the text for the given tab.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param font The font to paint with.
* @param metrics The fontmetrics of the given font.
* @param tabIndex The tab index.
* @param title The string to paint.
* @param textRect The bounds of the string.
* @param isSelected Whether this tab is selected.
*/
protected void paintText(Graphics g, int tabPlacement, Font font,
FontMetrics metrics, int tabIndex, String title,
Rectangle textRect, boolean isSelected)
{
View textView = getTextViewForTab(tabIndex);
if (textView != null)
{
textView.paint(g, textRect);
return;
}
Color fg = tabPane.getForegroundAt(tabIndex);
if (fg == null)
fg = tabPane.getForeground();
Color bg = tabPane.getBackgroundAt(tabIndex);
if (bg == null)
bg = tabPane.getBackground();
Color saved_color = g.getColor();
Font f = g.getFont();
g.setFont(font);
if (tabPane.isEnabledAt(tabIndex))
{
g.setColor(fg);
int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex);
if (mnemIndex != -1)
BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex,
textRect.x,
textRect.y
+ metrics.getAscent());
else
g.drawString(title, textRect.x, textRect.y + metrics.getAscent());
}
else
{
g.setColor(bg.brighter());
int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex);
if (mnemIndex != -1)
BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex,
textRect.x, textRect.y);
else
g.drawString(title, textRect.x, textRect.y);
g.setColor(bg.darker());
if (mnemIndex != -1)
BasicGraphicsUtils.drawStringUnderlineCharAt(g, title, mnemIndex,
textRect.x + 1,
textRect.y + 1);
else
g.drawString(title, textRect.x + 1, textRect.y + 1);
}
g.setColor(saved_color);
g.setFont(f);
}
/**
* This method returns how much the label for the tab should shift in the X
* direction.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The tab index being painted.
* @param isSelected Whether this tab is selected.
*
* @return The amount the label should shift by in the X direction.
*/
protected int getTabLabelShiftX(int tabPlacement, int tabIndex,
boolean isSelected)
{
// No reason to shift.
return 0;
}
/**
* This method returns how much the label for the tab should shift in the Y
* direction.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The tab index being painted.
* @param isSelected Whether this tab is selected.
*
* @return The amount the label should shift by in the Y direction.
*/
protected int getTabLabelShiftY(int tabPlacement, int tabIndex,
boolean isSelected)
{
// No reason to shift.
return 0;
}
/**
* This method paints the focus rectangle around the selected tab.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param rects The array of rectangles keeping track of size and position.
* @param tabIndex The tab index.
* @param iconRect The icon bounds.
* @param textRect The text bounds.
* @param isSelected Whether this tab is selected.
*/
protected void paintFocusIndicator(Graphics g, int tabPlacement,
Rectangle[] rects, int tabIndex,
Rectangle iconRect, Rectangle textRect,
boolean isSelected)
{
Color saved = g.getColor();
calcRect = iconRect.union(textRect);
g.setColor(focus);
g.drawRect(calcRect.x, calcRect.y, calcRect.width, calcRect.height);
g.setColor(saved);
}
/**
* This method paints the border for an individual tab.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The tab index.
* @param x The x position of the tab.
* @param y The y position of the tab.
* @param w The width of the tab.
* @param h The height of the tab.
* @param isSelected Whether the tab is selected.
*/
protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex,
int x, int y, int w, int h, boolean isSelected)
{
Color saved = g.getColor();
if (! isSelected || tabPlacement != SwingConstants.TOP)
{
g.setColor(shadow);
g.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1);
g.setColor(darkShadow);
g.drawLine(x, y + h, x + w, y + h);
}
if (! isSelected || tabPlacement != SwingConstants.LEFT)
{
g.setColor(darkShadow);
g.drawLine(x + w, y, x + w, y + h);
g.setColor(shadow);
g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1);
}
if (! isSelected || tabPlacement != SwingConstants.RIGHT)
{
g.setColor(lightHighlight);
g.drawLine(x, y, x, y + h);
}
if (! isSelected || tabPlacement != SwingConstants.BOTTOM)
{
g.setColor(lightHighlight);
g.drawLine(x, y, x + w, y);
}
g.setColor(saved);
}
/**
* This method paints the background for an individual tab.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The tab index.
* @param x The x position of the tab.
* @param y The y position of the tab.
* @param w The width of the tab.
* @param h The height of the tab.
* @param isSelected Whether the tab is selected.
*/
protected void paintTabBackground(Graphics g, int tabPlacement,
int tabIndex, int x, int y, int w, int h,
boolean isSelected)
{
Color saved = g.getColor();
if (isSelected)
g.setColor(Color.LIGHT_GRAY);
else
{
Color bg = tabPane.getBackgroundAt(tabIndex);
if (bg == null)
bg = Color.GRAY;
g.setColor(bg);
}
g.fillRect(x, y, w, h);
g.setColor(saved);
}
/**
* This method paints the border around the content area.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param selectedIndex The index of the selected tab.
*/
protected void paintContentBorder(Graphics g, int tabPlacement,
int selectedIndex)
{
Insets insets = getContentBorderInsets(tabPlacement);
int x = contentRect.x;
int y = contentRect.y;
int w = contentRect.width;
int h = contentRect.height;
paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h);
paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h);
}
/**
* This method paints the top edge of the content border.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param selectedIndex The selected tab index.
* @param x The x coordinate for the content area.
* @param y The y coordinate for the content area.
* @param w The width of the content area.
* @param h The height of the content area.
*/
protected void paintContentBorderTopEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y,
int w, int h)
{
Color saved = g.getColor();
g.setColor(lightHighlight);
int startgap = rects[selectedIndex].x;
int endgap = rects[selectedIndex].x + rects[selectedIndex].width;
int diff = 0;
if (tabPlacement == SwingConstants.TOP)
{
if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
{
Point p = findPointForIndex(currentScrollLocation);
diff = p.x;
}
g.drawLine(x, y, startgap - diff, y);
g.drawLine(endgap - diff, y, x + w, y);
}
else
g.drawLine(x, y, x + w, y);
g.setColor(saved);
}
/**
* This method paints the left edge of the content border.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param selectedIndex The selected tab index.
* @param x The x coordinate for the content area.
* @param y The y coordinate for the content area.
* @param w The width of the content area.
* @param h The height of the content area.
*/
protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y,
int w, int h)
{
Color saved = g.getColor();
g.setColor(lightHighlight);
int startgap = rects[selectedIndex].y;
int endgap = rects[selectedIndex].y + rects[selectedIndex].height;
int diff = 0;
if (tabPlacement == SwingConstants.LEFT)
{
if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
{
Point p = findPointForIndex(currentScrollLocation);
diff = p.y;
}
g.drawLine(x, y, x, startgap - diff);
g.drawLine(x, endgap - diff, x, y + h);
}
else
g.drawLine(x, y, x, y + h);
g.setColor(saved);
}
/**
* This method paints the bottom edge of the content border.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param selectedIndex The selected tab index.
* @param x The x coordinate for the content area.
* @param y The y coordinate for the content area.
* @param w The width of the content area.
* @param h The height of the content area.
*/
protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y,
int w, int h)
{
Color saved = g.getColor();
int startgap = rects[selectedIndex].x;
int endgap = rects[selectedIndex].x + rects[selectedIndex].width;
int diff = 0;
if (tabPlacement == SwingConstants.BOTTOM)
{
if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
{
Point p = findPointForIndex(currentScrollLocation);
diff = p.x;
}
g.setColor(shadow);
g.drawLine(x + 1, y + h - 1, startgap - diff, y + h - 1);
g.drawLine(endgap - diff, y + h - 1, x + w - 1, y + h - 1);
g.setColor(darkShadow);
g.drawLine(x, y + h, startgap - diff, y + h);
g.drawLine(endgap - diff, y + h, x + w, y + h);
}
else
{
g.setColor(shadow);
g.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1);
g.setColor(darkShadow);
g.drawLine(x, y + h, x + w, y + h);
}
g.setColor(saved);
}
/**
* This method paints the right edge of the content border.
*
* @param g The Graphics object to paint with.
* @param tabPlacement The JTabbedPane's tab placement.
* @param selectedIndex The selected tab index.
* @param x The x coordinate for the content area.
* @param y The y coordinate for the content area.
* @param w The width of the content area.
* @param h The height of the content area.
*/
protected void paintContentBorderRightEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y,
int w, int h)
{
Color saved = g.getColor();
int startgap = rects[selectedIndex].y;
int endgap = rects[selectedIndex].y + rects[selectedIndex].height;
int diff = 0;
if (tabPlacement == SwingConstants.RIGHT)
{
if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
{
Point p = findPointForIndex(currentScrollLocation);
diff = p.y;
}
g.setColor(shadow);
g.drawLine(x + w - 1, y + 1, x + w - 1, startgap - diff);
g.drawLine(x + w - 1, endgap - diff, x + w - 1, y + h - 1);
g.setColor(darkShadow);
g.drawLine(x + w, y, x + w, startgap - diff);
g.drawLine(x + w, endgap - diff, x + w, y + h);
}
else
{
g.setColor(shadow);
g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1);
g.setColor(darkShadow);
g.drawLine(x + w, y, x + w, y + h);
}
g.setColor(saved);
}
/**
* This method returns the tab bounds for the given index.
*
* @param pane The JTabbedPane.
* @param i The index to look for.
*
* @return The bounds of the tab with the given index.
*/
public Rectangle getTabBounds(JTabbedPane pane, int i)
{
return rects[i];
}
/**
* This method returns the number of runs.
*
* @param pane The JTabbedPane.
*
* @return The number of runs.
*/
public int getTabRunCount(JTabbedPane pane)
{
return runCount;
}
/**
* This method returns the tab index given a coordinate.
*
* @param pane The JTabbedPane.
* @param x The x coordinate.
* @param y The y coordinate.
*
* @return The tab index that the coordinate lands in.
*/
public int tabForCoordinate(JTabbedPane pane, int x, int y)
{
Point p = new Point(x, y);
int tabCount = tabPane.getTabCount();
int currRun = 1;
for (int i = 0; i < runCount; i++)
{
int first = lastTabInRun(tabCount, getPreviousTabRun(currRun)) + 1;
if (first == tabCount)
first = 0;
int last = lastTabInRun(tabCount, currRun);
for (int j = first; j <= last; j++)
{
if (getTabBounds(pane, j).contains(p))
return j;
}
currRun = getNextTabRun(currRun);
}
return -1;
}
/**
* This method returns the tab bounds in the given rectangle.
*
* @param tabIndex The index to get bounds for.
* @param dest The rectangle to store bounds in.
*
* @return The rectangle passed in.
*/
protected Rectangle getTabBounds(int tabIndex, Rectangle dest)
{
dest.setBounds(getTabBounds(tabPane, tabIndex));
return dest;
}
/**
* This method returns the component that is shown in the content area.
*
* @return The component that is shown in the content area.
*/
protected Component getVisibleComponent()
{
return tabPane.getComponentAt(tabPane.getSelectedIndex());
}
/**
* This method sets the visible component.
*
* @param component The component to be set visible.
*/
protected void setVisibleComponent(Component component)
{
component.setVisible(true);
tabPane.setSelectedComponent(component);
}
/**
* This method assures that enough rectangles are created given the
* tabCount. The old array is copied to the new one.
*
* @param tabCount The number of tabs.
*/
protected void assureRectsCreated(int tabCount)
{
if (rects == null)
rects = new Rectangle[tabCount];
if (tabCount == rects.length)
return;
else
{
int numToCopy = Math.min(tabCount, rects.length);
Rectangle[] tmp = new Rectangle[tabCount];
System.arraycopy(rects, 0, tmp, 0, numToCopy);
rects = tmp;
}
}
/**
* This method expands the tabRuns array to give it more room. The old array
* is copied to the new one.
*/
protected void expandTabRunsArray()
{
// This method adds another 10 index positions to the tabRuns array.
if (tabRuns == null)
tabRuns = new int[10];
else
{
int[] newRuns = new int[tabRuns.length + 10];
System.arraycopy(tabRuns, 0, newRuns, 0, tabRuns.length);
tabRuns = newRuns;
}
}
/**
* This method returns which run a particular tab belongs to.
*
* @param tabCount The number of tabs.
* @param tabIndex The tab to find.
*
* @return The tabRuns index that it belongs to.
*/
protected int getRunForTab(int tabCount, int tabIndex)
{
if (runCount == 1 && tabIndex < tabCount && tabIndex >= 0)
return 1;
for (int i = 0; i < runCount; i++)
{
int first = lastTabInRun(tabCount, getPreviousTabRun(i)) + 1;
if (first == tabCount)
first = 0;
int last = lastTabInRun(tabCount, i);
if (last >= tabIndex && first <= tabIndex)
return i;
}
return -1;
}
/**
* This method returns the index of the last tab in a run.
*
* @param tabCount The number of tabs.
* @param run The run to check.
*
* @return The last tab in the given run.
*/
protected int lastTabInRun(int tabCount, int run)
{
if (tabRuns[run] == 0)
return tabCount - 1;
else
return tabRuns[run] - 1;
}
/**
* This method returns the tab run overlay.
*
* @param tabPlacement The JTabbedPane's tab placement.
*
* @return The tab run overlay.
*/
protected int getTabRunOverlay(int tabPlacement)
{
return tabRunOverlay;
}
/**
* This method returns the tab run indent. It is used in WRAP_TAB_LAYOUT and
* makes each tab run start indented by a certain amount.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param run The run to get indent for.
*
* @return The amount a run should be indented.
*/
protected int getTabRunIndent(int tabPlacement, int run)
{
return 0;
}
/**
* This method returns whether a tab run should be padded.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param run The run to check.
*
* @return Whether the given run should be padded.
*/
protected boolean shouldPadTabRun(int tabPlacement, int run)
{
return true;
}
/**
* This method returns whether the tab runs should be rotated.
*
* @param tabPlacement The JTabbedPane's tab placement.
*
* @return Whether runs should be rotated.
*/
protected boolean shouldRotateTabRuns(int tabPlacement)
{
return true;
}
/**
* This method returns an icon for the tab. If the tab is disabled, it
* should return the disabledIcon. If it is enabled, then it should return
* the default icon.
*
* @param tabIndex The tab index to get an icon for.
*
* @return The icon for the tab index.
*/
protected Icon getIconForTab(int tabIndex)
{
if (tabPane.isEnabledAt(tabIndex))
return tabPane.getIconAt(tabIndex);
else
return tabPane.getDisabledIconAt(tabIndex);
}
/**
* This method returns a view that can paint the text for the label.
*
* @param tabIndex The tab index to get a view for.
*
* @return The view for the tab index.
*/
protected View getTextViewForTab(int tabIndex)
{
return null;
}
/**
* This method returns the tab height, including insets, for the given index
* and fontheight.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The index of the tab to calculate.
* @param fontHeight The font height.
*
* @return This tab's height.
*/
protected int calculateTabHeight(int tabPlacement, int tabIndex,
int fontHeight)
{
Icon icon = getIconForTab(tabIndex);
Insets insets = getTabInsets(tabPlacement, tabIndex);
if (icon != null)
{
Rectangle vr = new Rectangle();
Rectangle ir = new Rectangle();
Rectangle tr = new Rectangle();
layoutLabel(tabPlacement, getFontMetrics(), tabIndex,
tabPane.getTitleAt(tabIndex), icon, vr, ir, tr,
tabIndex == tabPane.getSelectedIndex());
calcRect = tr.union(ir);
}
else
calcRect.height = fontHeight;
calcRect.height += insets.top + insets.bottom;
return calcRect.height;
}
/**
* This method returns the max tab height.
*
* @param tabPlacement The JTabbedPane's tab placement.
*
* @return The maximum tab height.
*/
protected int calculateMaxTabHeight(int tabPlacement)
{
maxTabHeight = 0;
FontMetrics fm = getFontMetrics();
int fontHeight = fm.getHeight();
for (int i = 0; i < tabPane.getTabCount(); i++)
maxTabHeight = Math.max(calculateTabHeight(tabPlacement, i, fontHeight),
maxTabHeight);
return maxTabHeight;
}
/**
* This method calculates the tab width, including insets, for the given tab
* index and font metrics.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The tab index to calculate for.
* @param metrics The font's metrics.
*
* @return The tab width for the given index.
*/
protected int calculateTabWidth(int tabPlacement, int tabIndex,
FontMetrics metrics)
{
Icon icon = getIconForTab(tabIndex);
Insets insets = getTabInsets(tabPlacement, tabIndex);
if (icon != null)
{
Rectangle vr = new Rectangle();
Rectangle ir = new Rectangle();
Rectangle tr = new Rectangle();
layoutLabel(tabPlacement, getFontMetrics(), tabIndex,
tabPane.getTitleAt(tabIndex), icon, vr, ir, tr,
tabIndex == tabPane.getSelectedIndex());
calcRect = tr.union(ir);
}
else
calcRect.width = metrics.stringWidth(tabPane.getTitleAt(tabIndex));
calcRect.width += insets.left + insets.right;
return calcRect.width;
}
/**
* This method calculates the max tab width.
*
* @param tabPlacement The JTabbedPane's tab placement.
*
* @return The maximum tab width.
*/
protected int calculateMaxTabWidth(int tabPlacement)
{
maxTabWidth = 0;
FontMetrics fm = getFontMetrics();
for (int i = 0; i < tabPane.getTabCount(); i++)
maxTabWidth = Math.max(calculateTabWidth(tabPlacement, i, fm),
maxTabWidth);
return maxTabWidth;
}
/**
* This method calculates the tab area height, including insets, for the
* given amount of runs and tab height.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param horizRunCount The number of runs.
* @param maxTabHeight The max tab height.
*
* @return The tab area height.
*/
protected int calculateTabAreaHeight(int tabPlacement, int horizRunCount,
int maxTabHeight)
{
Insets insets = getTabAreaInsets(tabPlacement);
int tabAreaHeight = horizRunCount * maxTabHeight
- (horizRunCount - 1) * tabRunOverlay;
tabAreaHeight += insets.top + insets.bottom;
return tabAreaHeight;
}
/**
* This method calculates the tab area width, including insets, for the
* given amount of runs and tab width.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param vertRunCount The number of runs.
* @param maxTabWidth The max tab width.
*
* @return The tab area width.
*/
protected int calculateTabAreaWidth(int tabPlacement, int vertRunCount,
int maxTabWidth)
{
Insets insets = getTabAreaInsets(tabPlacement);
int tabAreaWidth = vertRunCount * maxTabWidth
- (vertRunCount - 1) * tabRunOverlay;
tabAreaWidth += insets.left + insets.right;
return tabAreaWidth;
}
/**
* This method returns the tab insets appropriately rotated.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The tab index.
*
* @return The tab insets for the given index.
*/
protected Insets getTabInsets(int tabPlacement, int tabIndex)
{
Insets target = new Insets(0, 0, 0, 0);
rotateInsets(tabInsets, target, tabPlacement);
return target;
}
/**
* This method returns the selected tab pad insets appropriately rotated.
*
* @param tabPlacement The JTabbedPane's tab placement.
*
* @return The selected tab pad insets.
*/
protected Insets getSelectedTabPadInsets(int tabPlacement)
{
Insets target = new Insets(0, 0, 0, 0);
rotateInsets(selectedTabPadInsets, target, tabPlacement);
return target;
}
/**
* This method returns the tab area insets appropriately rotated.
*
* @param tabPlacement The JTabbedPane's tab placement.
*
* @return The tab area insets.
*/
protected Insets getTabAreaInsets(int tabPlacement)
{
Insets target = new Insets(0, 0, 0, 0);
rotateInsets(tabAreaInsets, target, tabPlacement);
return target;
}
/**
* This method returns the content border insets appropriately rotated.
*
* @param tabPlacement The JTabbedPane's tab placement.
*
* @return The content border insets.
*/
protected Insets getContentBorderInsets(int tabPlacement)
{
Insets target = new Insets(0, 0, 0, 0);
rotateInsets(contentBorderInsets, target, tabPlacement);
return target;
}
/**
* This method returns the fontmetrics for the font of the JTabbedPane.
*
* @return The font metrics for the JTabbedPane.
*/
protected FontMetrics getFontMetrics()
{
FontMetrics fm = tabPane.getToolkit().getFontMetrics(tabPane.getFont());
return fm;
}
/**
* This method navigates from the selected tab into the given direction. As
* a result, a new tab will be selected (if possible).
*
* @param direction The direction to navigate in.
*/
protected void navigateSelectedTab(int direction)
{
int tabPlacement = tabPane.getTabPlacement();
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
{
if (direction == SwingConstants.WEST)
selectPreviousTabInRun(tabPane.getSelectedIndex());
else if (direction == SwingConstants.EAST)
selectNextTabInRun(tabPane.getSelectedIndex());
else
{
int offset = getTabRunOffset(tabPlacement, tabPane.getTabCount(),
tabPane.getSelectedIndex(),
(tabPlacement == SwingConstants.RIGHT)
? true : false);
selectAdjacentRunTab(tabPlacement, tabPane.getSelectedIndex(),
offset);
}
}
if (tabPlacement == SwingConstants.LEFT
|| tabPlacement == SwingConstants.RIGHT)
{
if (direction == SwingConstants.NORTH)
selectPreviousTabInRun(tabPane.getSelectedIndex());
else if (direction == SwingConstants.SOUTH)
selectNextTabInRun(tabPane.getSelectedIndex());
else
{
int offset = getTabRunOffset(tabPlacement, tabPane.getTabCount(),
tabPane.getSelectedIndex(),
(tabPlacement == SwingConstants.RIGHT)
? true : false);
selectAdjacentRunTab(tabPlacement, tabPane.getSelectedIndex(),
offset);
}
}
}
/**
* This method selects the next tab in the run.
*
* @param current The current selected index.
*/
protected void selectNextTabInRun(int current)
{
tabPane.setSelectedIndex(getNextTabIndexInRun(tabPane.getTabCount(),
current));
}
/**
* This method selects the previous tab in the run.
*
* @param current The current selected index.
*/
protected void selectPreviousTabInRun(int current)
{
tabPane.setSelectedIndex(getPreviousTabIndexInRun(tabPane.getTabCount(),
current));
}
/**
* This method selects the next tab (regardless of runs).
*
* @param current The current selected index.
*/
protected void selectNextTab(int current)
{
tabPane.setSelectedIndex(getNextTabIndex(current));
}
/**
* This method selects the previous tab (regardless of runs).
*
* @param current The current selected index.
*/
protected void selectPreviousTab(int current)
{
tabPane.setSelectedIndex(getPreviousTabIndex(current));
}
/**
* This method selects the correct tab given an offset from the current tab
* index. If the tab placement is TOP or BOTTOM, the offset will be in the
* y direction, otherwise, it will be in the x direction. A new coordinate
* will be found by adding the offset to the current location of the tab.
* The tab that the new location will be selected.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabIndex The tab to start from.
* @param offset The coordinate offset.
*/
protected void selectAdjacentRunTab(int tabPlacement, int tabIndex,
int offset)
{
int x = rects[tabIndex].x + rects[tabIndex].width / 2;
int y = rects[tabIndex].y + rects[tabIndex].height / 2;
switch (tabPlacement)
{
case SwingConstants.TOP:
case SwingConstants.BOTTOM:
y += offset;
break;
case SwingConstants.RIGHT:
case SwingConstants.LEFT:
x += offset;
break;
}
int index = tabForCoordinate(tabPane, x, y);
if (index != -1)
tabPane.setSelectedIndex(index);
}
// This method is called when you press up/down to cycle through tab runs.
// it returns the distance (between the two runs' x/y position.
// where one run is the current selected run and the other run is the run in the
// direction of the scroll (dictated by the forward flag)
// the offset is an absolute value of the difference
/**
* This method calculates the offset distance for use in
* selectAdjacentRunTab. The offset returned will be a difference in the y
* coordinate between the run in the desired direction and the current run
* (for tabPlacement in TOP or BOTTOM). Use x coordinate for LEFT and
* RIGHT.
*
* @param tabPlacement The JTabbedPane's tab placement.
* @param tabCount The number of tabs.
* @param tabIndex The starting index.
* @param forward If forward, the run in the desired direction will be the
* next run.
*
* @return The offset between the two runs.
*/
protected int getTabRunOffset(int tabPlacement, int tabCount, int tabIndex,
boolean forward)
{
int currRun = getRunForTab(tabCount, tabIndex);
int offset;
int nextRun = (forward) ? getNextTabRun(currRun) : getPreviousTabRun(currRun);
if (tabPlacement == SwingConstants.TOP
|| tabPlacement == SwingConstants.BOTTOM)
offset = rects[lastTabInRun(tabCount, nextRun)].y
- rects[lastTabInRun(tabCount, currRun)].y;
else
offset = rects[lastTabInRun(tabCount, nextRun)].x
- rects[lastTabInRun(tabCount, currRun)].x;
return offset;
}
/**
* This method returns the previous tab index.
*
* @param base The index to start from.
*
* @return The previous tab index.
*/
protected int getPreviousTabIndex(int base)
{
base--;
if (base < 0)
return tabPane.getTabCount() - 1;
return base;
}
/**
* This method returns the next tab index.
*
* @param base The index to start from.
*
* @return The next tab index.
*/
protected int getNextTabIndex(int base)
{
base++;
if (base == tabPane.getTabCount())
return 0;
return base;
}
/**
* This method returns the next tab index in the run. If the next index is
* out of this run, it will return the starting tab index for the run.
*
* @param tabCount The number of tabs.
* @param base The index to start from.
*
* @return The next tab index in the run.
*/
protected int getNextTabIndexInRun(int tabCount, int base)
{
int index = getNextTabIndex(base);
int run = getRunForTab(tabCount, base);
if (index == lastTabInRun(tabCount, run) + 1)
index = lastTabInRun(tabCount, getPreviousTabRun(run)) + 1;
return getNextTabIndex(base);
}
/**
* This method returns the previous tab index in the run. If the previous
* index is out of this run, it will return the last index for the run.
*
* @param tabCount The number of tabs.
* @param base The index to start from.
*
* @return The previous tab index in the run.
*/
protected int getPreviousTabIndexInRun(int tabCount, int base)
{
int index = getPreviousTabIndex(base);
int run = getRunForTab(tabCount, base);
if (index == lastTabInRun(tabCount, getPreviousTabRun(run)))
index = lastTabInRun(tabCount, run);
return getPreviousTabIndex(base);
}
/**
* This method returns the index of the previous run.
*
* @param baseRun The run to start from.
*
* @return The index of the previous run.
*/
protected int getPreviousTabRun(int baseRun)
{
if (getTabRunCount(tabPane) == 1)
return 1;
int prevRun = --baseRun;
if (prevRun < 0)
prevRun = getTabRunCount(tabPane) - 1;
return prevRun;
}
/**
* This method returns the index of the next run.
*
* @param baseRun The run to start from.
*
* @return The index of the next run.
*/
protected int getNextTabRun(int baseRun)
{
if (getTabRunCount(tabPane) == 1)
return 1;
int nextRun = ++baseRun;
if (nextRun == getTabRunCount(tabPane))
nextRun = 0;
return nextRun;
}
/**
* This method rotates the insets given a direction to rotate them in.
* Target placement should be one of TOP, LEFT, BOTTOM, RIGHT. The rotated
* insets will be stored in targetInsets. Passing in TOP as the direction
* does nothing. Passing in LEFT switches top and left, right and bottom.
* Passing in BOTTOM switches top and bottom. Passing in RIGHT switches top
* for left, left for bottom, bottom for right, and right for top.
*
* @param topInsets The reference insets.
* @param targetInsets An Insets object to store the new insets.
* @param targetPlacement The rotation direction.
*/
protected static void rotateInsets(Insets topInsets, Insets targetInsets,
int targetPlacement)
{
// Sun's version will happily throw an NPE if params are null,
// so I won't check it either.
switch (targetPlacement)
{
case SwingConstants.TOP:
targetInsets.top = topInsets.top;
targetInsets.left = topInsets.left;
targetInsets.right = topInsets.right;
targetInsets.bottom = topInsets.bottom;
break;
case SwingConstants.LEFT:
targetInsets.left = topInsets.top;
targetInsets.top = topInsets.left;
targetInsets.right = topInsets.bottom;
targetInsets.bottom = topInsets.right;
break;
case SwingConstants.BOTTOM:
targetInsets.top = topInsets.bottom;
targetInsets.bottom = topInsets.top;
targetInsets.left = topInsets.left;
targetInsets.right = topInsets.right;
break;
case SwingConstants.RIGHT:
targetInsets.top = topInsets.left;
targetInsets.left = topInsets.bottom;
targetInsets.bottom = topInsets.right;
targetInsets.right = topInsets.top;
break;
}
}
}