diff options
author | Graydon Hoare <graydon@gcc.gnu.org> | 2004-09-02 05:10:34 +0000 |
---|---|---|
committer | Graydon Hoare <graydon@gcc.gnu.org> | 2004-09-02 05:10:34 +0000 |
commit | 57579172585eae4fd6f57c0dbd55ea998ddfb63f (patch) | |
tree | a420c1005dbef38d790847b62b0d57eb9bc758cb /libjava/javax/swing/JTable.java | |
parent | 1e8964cf94aa8b0e7176434d7b31fbf040416764 (diff) | |
download | gcc-57579172585eae4fd6f57c0dbd55ea998ddfb63f.zip gcc-57579172585eae4fd6f57c0dbd55ea998ddfb63f.tar.gz gcc-57579172585eae4fd6f57c0dbd55ea998ddfb63f.tar.bz2 |
[multiple changes]
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicTextAreaUI.java
(create): New method.
* javax/swing/text/DefaultHighlighter.java
(DefaultHighlightPainter.debugRect): Removed.
* javax/swing/text/StyleContext.java
(DEFAULT_STYLE): New field.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicLookAndFeel.java
(initComponentDefaults): Add keybindings for selection.backward and
selection-forward for text components.
* javax/swing/plaf/basic/BasicTextUI.java
(paintSafely): Paint highlight only when something is actually
selected.
* javax/swing/text/DefaultCaret.java
(handleHighlight): New method.
(setSelectionVisible): Don't do anything when nothing changes.
Handle highlight.
(moveDot): Reimplemented. Handle highlight.
(setDot): Set mark too. Handle highlight.
(getSelectionPainter): New method.
* javax/swing/text/DefaultEditorKit.java
(defaultActions): Added new actions for text selection.
* javax/swing/text/DefaultHighlighter.java
(DefaultHighlightPainter): New inner class.
(DefaultPainter): New field.
(paint): Implemented.
* javax/swing/text/PlainView.java
(paint): Don't draw background here again.
* javax/swing/text/Utilities.java
(getTabbedTextWidth): Use width of ' ' instead of 'm' for tabsize.
(drawTabbedText): Likewise.
2004-08-31 Graydon Hoare <graydon@redhat.com>
* javax/swing/JComponent.java
(resetKeyboardActions): Add null checks.
2004-08-31 Graydon Hoare <graydon@redhat.com>
* javax/swing/DefaultButtonModel.java:
Skip group notification when no group is set.
2004-08-31 Graydon Hoare <graydon@redhat.com>
* javax/swing/JColorChooser.java:
Make a couple inner classes static, for jikes.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicTextUI.java
(RottView.modelToView): New method.
(UpdateHandler): Renamed from EventHandler.
(updateHandler): Renamed from eventHandler.
(modelToView): Implemented.
* javax/swing/text/AbstractDocument.java
(BranchElement.getElement): Return null for non-existing indeces.
(BranchElement.getElementIndex): Return 0 in some corner cases.
* javax/swing/text/FieldView.java
(modelToView): New method.
* javax/swing/text/PlainView.java
(modelToView): Made public.
2004-08-31 Kim Ho <kho@redhat.com>
* Makefile.am: New files.
* Makefile.in: Regenerate.
* gcj/Makefile.in: Regenerate.
* include/Makefile.in: Regenerate.
* java/awt/Color.java: Fix documentation.
(RGBtoHSB): Use floats for conversions.
* javax/swing/ButtonGroup.java: Run Jalopy.
(setSelected): Reimplement.
* javax/swing/DefaultButtonModel.java: Run Jalopy.
(changeState): Let ButtonGroup know that the button
is changing state.
* javax/swing/JColorChooser.java: Implement.
* javax/swing/JLabel.java: Run Jalopy.
* javax/swing/JSpinner.java: Run Jalopy.
(setValue): New method.
* javax/swing/JTabbedPane.java: Run Jalopy.
(removeTabAt): Call correct remove method.
* javax/swing/SpinnerNumberModel.java: Run Jalopy.
(getPreviousValue): Compare minimum value.
* javax/swing/Timer.java: Run Jalopy.
(run): Comment out println.
* javax/swing/ToolTipManager.java:
(mouseMoved): Get new tooltip text for location.
* javax/swing/colorchooser/AbstractColorChooserPanel.java:
Jalopy and Javadoc.
* javax/swing/colorchooser/ColorChooserComponentFactory.java:
Implement.
* javax/swing/colorchooser/DefaultColorSelectionModel.java:
Run Jalopy.
(setSelectedColor): Fire ChangeEvent.
* javax/swing/colorchooser/DefaultHSBChooserPanel.java:
New file. Implement.
* javax/swing/colorchooser/DefaultPreviewPanel.java:
Ditto.
* javax/swing/colorchooser/DefaultRGBChooserPanel.java:
Ditto.
* javax/swing/colorchooser/DefaultSwatchChooserPanel.java:
Ditto.
* javax/swing/plaf/basic/BasicArrowButton.java:
(getArrow): Fix size of upward pointing button.
* javax/swing/plaf/basic/BasicColorChooserUI.java:
Implement.
* javax/swing/plaf/basic/BasicSliderUI.java:
(getWidthOfWidestLabel): Use preferred dimensions.
(getHeightOfTallestLabel): Ditto.
* javax/swing/plaf/basic/BasicSpinnerUI.java:
Run Jalopy.
(mousePressed): Disable changes to spinner if it is not enabled.
* testsuite/Makefile.in: Regenerate.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicTableHeaderUI.java,
javax/swing/plaf/basic/BasicTableUI.java:
Added copyright notice.
2004-08-31 Olga Rodimina <rodimina@redhat.com>
* Makefile.am: Added new files.
* Makefile.in: Regenerate.
* javax/swing/ComboBoxEditor.java: Added javadocs.
* javax/swing/ComboBoxModel.java: Likewise.
* javax/swing/DefaultComboBoxModel.java: Implemented.
* javax/swing/DefaultListCellRenderer.java: Added javadocs
and ran through jalopy to fix formatting style.
(getListCellRendererComponent): Use appropriate border
if renderer has focus and use noFocusBorder when it doesn't.
* javax/swing/JComboBox.java: Implemented.
* javax/swing/JList.java:
(locationToIndex): New Method. Implemented.
(indexToLocation): New Method.
* javax/swing/JPopupMenu.java:
(visible): New field.
(isVisible): Changed to use new field above.
(setVisible): Likewise.
* javax/swing/MutableComboBoxModel.java: Added javadocs.
* javax/swing/plaf/basic/BasicArrowButton.java:
(shadow): Changed default color to Color.gray.
* javax/swing/plaf/basic/BasicComboBoxUI.java: New File.
UI delegate for JComboBox.
* javax/swing/plaf/basic/BasicComboPopup.java: New File.
Popup menu containing list of JComboBox's items.
* javax/swing/plaf/basic/BasicComboBoxEditor.java: New File.
* javax/swing/plaf/basic/BasicComboBoxRenderer.java: New File.
* javax/swing/plaf/basic/BasicComboBoxUI.java: New File.
* javax/swing/plaf/basic/BasicComboPopup.java: New File.
* javax/swing/plaf/basic/BasicPopupMenuUI.java:
(popupMenuWillBecomeVisible): Set selected path to the first
element only if it is of type MenuElement. Also fix formatting
style.
* javax/swing/plaf/basic/ComboPopup.java: Added javadocs and missing
methods signatures.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/text/AbstractDocument.java
(createBranchElement): Use new constructor of BranchElement.
(createLeafElement): Renamed arguments.
(getRootElements): Implemented.
(BranchElement.start): Removed.
(BranchElement.end): Likewise.
(BranchElement.BranchElement): Fixed arguments.
(BranchElement.getEndOffset): Reimplemented.
(BranchElement.getStartOffset): Likewis.
* javax/swing/text/DefaultCaret.java
(paint): Draw simple vertical line as caret instead of a rectangle.
* javax/swing/text/JTextComponent.java
(setText): Use doc directly.
* javax/swing/text/PlainView.java
(nextTabStop): Implemented.
* javax/swing/text/Utilities.java
(drawTabbedText): nextTabStop() returns an absolute x position.
(getTabbedTextWidth): Likewise.
2004-08-31 Graydon Hoare <graydon@redhat.com>
* java/awt/Component.java
(isFocusTraversable): Predicate on isLightweight()
(setFocusable): Set isFocusTraversableOverridden.
(requestFocus): Predicate peer dispatch on !isLightweight()
(requestFocusInWindow): Likewise.
(dispatchEventImpl): Coordinate with KeyboardFocusManager.
* java/awt/Container.java
(dispatchEventImpl): Predicate on event mask.
(LightweightDispatcher): Remove focus machinery.
* java/awt/DefaultFocusTraversalPolicy.java
(accept): Expand predicate to include isFocusable().
* java/awt/DefaultKeyboardFocusManager.java:
Globally change c.dispatchEvent(e) to redispatchEvent(c,e)
* java/awt/KeyboardFocusManager.java
(redispatchEvent): Synchronize on event to prevent feedback.
* javax/swing/AbstractButton.java
(ButtonFocusListener): Remove class.
(init): Set focusPainted, focusable.
* javax/swing/ActionMap.java (get): Check parent for null.
* javax/swing/InputMap.java (get): Likewise.
* javax/swing/JComponent.java
(inputMap_whenFocused): New InputMap.
(inputMap_whenAncestorOfFocused): Likewise.
(inputMap_whenInFocusedWindow): Likewise.
(getActionForKeyStroke): Rewrite.
(getConditionForKeystroke): Likewise.
(ActionListenerProxy): New private class.
(setInputMap): Implement.
(getInputMap): Likewise.
(setActionMap): Likewise.
(getActionMap): Likewise.
(processComponentKeyEvent): New empty method.
(processKeyEvent): Implement.
(processKeyBinding): Likewise.
(resetKeyboardActions): Rewrite.
* javax/swing/KeyStroke.java: Rewrite.
* javax/swing/SwingUtilities.java
(notifyAction): Implement.
(replaceUIActionMap): Likewise.
(replaceUIInputMap): Likewise.
* javax/swing/plaf/basic/BasicButtonListener.java
(focusGained): Implement.
(focusLost): Repaint if focusPainted().
(installKeyboardActions): Install pressed / released actions.
(uninstallKeyboardActions): Implement.
* javax/swing/plaf/basic/BasicButtonUI.java
(focusColor): New field.
(installDefaults): Load focus color, install input map.
(installKeyboardActions): Implement.
(uninstallKeyboardActions): Likewise.
(paintFocus): Rewrite.
* javax/swing/plaf/basic/BasicLookAndFeel.java
(Button.focus): New default, midPurple.
* javax/swing/plaf/basic/BasicTextUI.java
(kit): Make static.
(installUI): Get doc from kit, load defaults.
(getKeymapName): Implement.
(createKeymap): Likewise.
(installKeyboardActions): Likewise.
(getInputMap): Likewise.
(getActionMap): Likewise.
(createActionMap): Likewise.
* javax/swing/text/AbstractDocument.java
(getStartPosition): Implement.
(getEndPosition): Likewise.
* javax/swing/text/DefaultEditorKit.java
(CopyAction): New class.
(CutAction): Likewise.
(DefaultKeyTypedAction): Likewise.
(InsertBreakAction): Likewise.
(InsertContentAction): Likewise.
(InsertTabAction): Likewise.
(PasteAction): Likewise.
(defaultActions): New static table.
(createCaret): Implement.
(getActions): Likewise.
* javax/swing/text/JTextComponent.java
(KeymapWrapper): New private class.
(KeymapActionMap): Likewise.
(DefaultKeymap): New class.
(keymaps): New static table.
(keymap): New field.
(getKeymap): Implement.
(removeKeymap): Likewise.
(addKeymap): Likewise.
(setKeymap): Likewise.
(loadKeymap): Likewise.
(getActions): Likewise.
(margin): New field.
(JTextComponent): Build and install default keymap.
* javax/swing/text/TextAction.java
(textAction): Call super properly.
(getTextComponent): Implement.
* javax/swing/text/Utilities.java
(drawTabbedText): Adjust position by ascent.
2004-08-31 David Jee <djee@redhat.com>
PR AWT/17156
* gnu/java/awt/peer/gtk/GtkMenuItemPeer.java
(setEnabled): Make it a native method.
* java/awt/DefaultKeyboardFocusManager.java
(postProcessKeyEvent): Only post event if the menu item
is active.
* java/awt/MenuItem.java:
Private field 'enabled' should be true by default.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
(setEnabled): New function.
2004-08-31 David Jee <djee@redhat.com>
PR AWT/17059
* gnu/java/awt/peer/gtk/GtkMenuBarPeer.java
(nativeSetHelpMenu): New native method declaration.
(addHelpMenu): Call nativeSetHelpMenu().
(addMenu): Remove.
* java/awt/MenuBar.java
(setHelpMenu): Call addNotify() on the new help menu.
(add): Call addNotify() on the new menu.
(addNotify): Set the help menu if one exists.
* java/awt/peer/MenuBarPeer.java
(addMenu): Remove.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
(nativeSetHelpMenu): New method.
2004-08-31 Graydon Hoare <graydon@redhat.com>
* Makefile.am: Add new files.
* Makefile.in: Regenerate.
* javax/swing/Box.java: Fix setting of layout in ctor.
* javax/swing/JScrollPane.java: Scroll headers as well.
* javax/swing/JTable.java: Reimplement.
* javax/swing/JViewPort.java: Only add non-null children.
* javax/swing/ScrollPaneLayout.java: Correct header calculations.
* javax/swing/Timer.java: Fix stopping null waker.
* javax/swing/plaf/basic/BasicTableHeaderUI.java: New file.
* javax/swing/plaf/basic/BasicTableUI.java: New file.
* javax/swing/table/DefaultTableCellRenderer.java: Configure.
* javax/swing/table/DefaultTableColumnModel.java: Flesh out.
* javax/swing/table/DefaultTableModel.java: Clean up.
* javax/swing/table/JTableHeader.java: Implement.
2004-08-31 Mark Wielaard <mark@klomp.org>
* javax/swing/JSpinner.java (getChangeListeners): Remove double
semi-colon.
2004-08-31 Mark Wielaard <mark@klomp.org>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c:
Declare variables at top of functions/block.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c: Likewise.
2004-08-31 Mark Wielaard <mark@klomp.org>
* java/lang/Rectangle.java (intersects): Check r.width and r.height
first.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/text/PlainView.java
(selectedColor): New field.
(unselectedColor): Likewise.
(font): Likewise.
(updateMetrics): New method.
(lineToRect): Likewise.
(modelToView): Likewise.
(drawSelectedText): Use color from JTextComponent ad draw with
Utilities class.
(drawUnselectedText): Likewise.
(paint): Initialize helper fields.
* javax/swing/text/View.java
(getChildAllocation): New method.
(getViewIndex): Likewise.
(getToolTipText): Likewise.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/text/Utilities.java
(drawTabbedText): Reimplemented.
(getTabbedTextWidth): Likewise.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicTextUI.java
(installDefaults): Install caret and highlighter.
(modelToView): Use Bias.Forward when calling sibling.
* javax/swing/text/AbstractDocument.java
(ElementEdit): Implements DocumentEvent.ElementChange.
(ElementEdit.ElementEdit): New method.
(ElementEdit.getChildrenAdded): Likewise.
(ElementEdit.getChildrenRemoved): Likewise.
(ElementEdit.getElement): Likewise.
(ElementEdit.getIndex): Likewise.
* javax/swing/text/DefaultCaret.java
(color): Removed.
(textComponent): Renamed from parent, made private.
(selectionVisible): Renamed from vis_sel, made private.
(blinkRate): Renamed from blink, made private.
(magicCaretPosition): Renamed from magic, made private.
(visible): Renamed from vis, made private.
(dot): Made private.
(mark): Likewise.
(deinstall): Remove as MouseMotionListener.
(install): Initialize textComponent first. Add as MouseMotionListener.
(paint): Reimplemented.
* javax/swing/text/JTextComponent.java
(setCaret): Deinstall old caret, install new one and fire property
change after setting property.
(setHighlighter): Deinstall old highlighter, install new one and fire
property change after setting property.
(setCaretColor): Fire property change after setting property.
(setDisabledTextColor): Likewise.
(setSelectedTextColor): Likewise.
(setSelectionColor): Likewise.
(modelToView): New method.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/text/AbstractDocument.java
(getText): Simplified.
* javax/swing/text/Segment.java
(current): New field.
(current): Reimplemented.
(first): Likewise.
(getIndex): Likewise.
(last): Likewise.
(next): Likewise.
(previous): Likewise.
(setIndex): Likewise.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicButtonUI.java
(defaultTextIconGap): Made protected.
(defaultTextShiftOffset): Likewise.
(textShiftOffset): New field.
(clearTextShiftOffset): New method.
(getTextShiftOffset): Likewise.
(setTextShiftOffset): Likewise.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicTextUI.java
(installUI): Add eventHandler as property listener.
(uninstallUI): remove eventHandler as propert listener.
(installDefaults): Added comment.
(installListeners): Likewise.
(installKeyboardActions): Likewise.
(uninstallDefaults): Likewise.
(uninstallListeners): Likewise.
(uninstallKeyboardActions): Likewise.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/text/AbstractDocument.java:
Fixed some typos in comments.
(insertString): Reimplemented.
(remove): Likewise.
(replace): New method.
(children): Dont use fully qualified class name.
(DefaultDocumentEvent.offset): Renamed from off.
(DefaultDocumentEvent.length): Renamed from len.
(DefaultDocumentEvent.type): New field.
(DefaultDocumentEvent.DefaultDocumentEvent): New constructor.
(DefaultDocumentEvent.getType): Implemented.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicTextUI.java
(RootView.textComponent): Removed.
(RootView.RootView): Don't initialize textComponent.
(RootView.getViewFactory): New method.
(EventHandler): New inner class.
(rootView): Initialize at instance creation.
(eventHandler): New field.
(installUI): Don't create view hierarchy directly,
call modelChanged() instead.
(modelChanged): New method.
* javax/swing/text/JTextComponent.java
(setDocument): Fire property change event.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicTextUI.java
(RootView.paint): Removed debug output.
(paintSafely): Draw highlighter before text.
(paintBackground): Use background color of text component.
* javax/swing/plaf/basic/BasicToggleButtonUI.java:
Reformatted.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicToolBarUI.java
(BasicToolBarUI): Fixed arguments for constructor.
(createUI): Fixed creation of object.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/DefaultListSelectionModel.java
(fireValueChanged): Renamed from fireSelectionValueChanged,
made protected.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/text/TabSet.java
(TabSet): Implements java.io.Serializable.
* javax/swing/text/TabStop.java
(TabStop): Implements java.io.Serializable.
(TabStop): Made public.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/JComponent.java
(setUI): Fire PropertyChange.
* javax/swing/JLabel.java
(text): Renamed from labelText.
(horizontalAlignment): New default vlaue.
(icon): Renamed from activeIcon.
(displayedMnemonic): Renamed from mnemonicKey, added default value.
(displayedMnemonicIndex): Renamed from underlineChar.
(setDisplayedMnemonic): Reimplemented.
* javax/swing/JRadioButton.java
(JRadioButton): New constructors.
* javax/swing/JTextField.java
(JTextField): Throw exception if colums < 0, initialitialz
this.columns directly and initialize document with text conditionally.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicFormattedTextFieldUI.java,
javax/swing/plaf/basic/BasicPasswordFieldUI.java,
javax/swing/plaf/basic/BasicTextAreaUI.java: New files.
* javax/swing/text/FieldView.java
(paint): Just call super method for now.
* Makefile.am: Added new files.
* Makefile.in: Regenerated.
2004-08-31 Ka-Hing Cheung <kahing@javabsp.org>
* javax/swing/AbstractSpinnerModel.java,
javax/swing/JSpinner.java,
javax/swing/SpinnerNumberModel.java,
javax/swing/plaf/basic/BasicSpinnerUI.java:
New files.
* javax/swing/plaf/basic/BasicLookAndFeel.java
(initClassDefaults): Added defaults for BasicSpinnerUI.
2004-08-31 Michael Koch <konqueror@gmx.de>
* Makefile.am: Added new files.
* Makefile.in: Regenerated.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/TransferHandler.java,
javax/swing/plaf/basic/ComboPopup.java: New files
* Makefile.am: Added javax/swing/TransferHandler.java and
javax/swing/plaf/basic/ComboPopup.java
* Makefile.in: Regenerated.
2004-08-31 Roman Kennke <roman@ontographics.com>
* javax/swing/text/Utilities.java: New file.
2004-08-31 Michael Koch <konqueror@gmx.de>
* Makefile.am: Added javax/swing/text/Utilities.java.
* Makefile.in: Regenerated.
2004-08-31 Graydon Hoare <graydon@redhat.com>
* javax/swing/text/SimpleAttributeSet.java: New file.
* javax/swing/text/StyleConstants.java: New file.
* javax/swing/text/StyleContext.java: New file.
* javax/swing/text/TabSet.java: New file.
* javax/swing/text/TabStop.java: New file.
* javax/swing/text/AbstactDocument.java:
(AbstractElement): Implement attribute support.
* javax/swing/text/AttributeSet.java
(NameAttribute): New static field.
(ResolveAttribute): New static field.
* Makefile.am: Update for new files.
* Makefile.in: Regenerate.
2004-08-31 Craig Black <craig.black@aonix.com>
* gnu/java/awt/peer/gtk/GdkGraphics.java
(drawImage): Add support for scaling pixmaps.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
(copyAndScalePixmap): New native method.
2004-08-31 Thomas Fitzsimmons <fitzsim@redhat.com>
PR AWT/16121
* jni/gtk-peer/gthread-jni.c: Include stdio.h. Eliminate
type-punning compiler warnings using unions.
(throw): Replace bzero with memset.
2004-08-31 Andreas Tobler <a.tobler@schweiz.ch>
Thomas Fitzsimmons <fitzsim@redhat.com>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c: Move
NSA_PB macros to gtkpeer.h. Include gtkpeer.h.
* jni/gtk-peer/gtkpeer.h: Move NSA_PB macros here.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(nativeSetIconImageFromDecoder): Use NSA_GET_PB_PTR macro.
2004-08-31 Mark Wielaard <mark@klomp.org>
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c:
#include gdk.h, not gtk.h. #include jni.h, native_state.h, string.h
and stdlib.h, not gtkpeer.h.
(*vm): New static variable.
(areaPreparedID): Make static.
(areaUpdatedID): Likewise.
(area_prepared): Get and use JNIEnv through stored JavaVM *vm.
(area_prepared): Likewise.
(area_updated): Likewise.
(closed): Likewise.
(initStaticState): Initialize *vm javaVM.
(pumpBytes): Use given env, not global gdk_env.
2004-08-31 Mark Wielaard <mark@klomp.org>
* java/awt/geom/CubicCurve2D.java (solveCubic): Removed duplicate
comments.
2004-08-31 Sven de Marothy <sven@physto.se>
* java/awt/geom/CubicCurve2D.java: Reindent.
(contains): Implemented.
(intersects): Implemented.
* java/awt/geom/QuadCurve2D.java: Likewise.
* java/awt/geom/GeneralPath.java: Reindent and document.
Fully (re)implemented using separate xpoints and ypoints
float[] coords.
* java/awt/geom/RoundRectangle2D.java: Several bugfixes (Bug #6007).
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/JMenuItem.java
(getMenuDragMouseListeners): New method.
(getMenuKeyListeners): Likewise.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/AbstractButton.java
(model): Made protected.
(actionListener): Likewise.
(changeListener): Likewise.
(itemListener): Likewise.
(multiClickThreshhold): New field.
(getActionListeners): New method.
(getChangeListeners): Likewise.
(getItemListeners): Likewise.
(fireItemStateChanged): Simplified implementation.
(fireActionPerformed): Likewise.
(fireStateChanged): Likewise.
(getMultiClickThreshhold): New method.
(setMultiClickThreshhold): Likewise.
2004-08-31 Tom Tromey <tromey@redhat.com>
* java/awt/image/Kernel.java (clone): Use super.clone().
2004-08-31 David Jee <djee@redhat.com>
PR AWT/16682
* gnu/java/awt/peer/gtk/GtkFramePeer.java
(nativeSetIconImage): Rename to nativeSetIconImageFromDecoder.
(nativeSetIconImageFromData): New native method declaration.
(setIconImage): Handle images not produced from GdkPixbufDecoder.
* gnu/java/awt/peer/gtk/GtkImage.java
(getPixelCache): New method.
(getColorModel): New method.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(nativeSetIconImage): Rename to nativeSetIconImageFromDecoder.
(free_pixbuf_data): New helper function.
(nativeSetIconImageFromData): New function.
2004-08-31 Graydon Hoare <graydon@redhat.com>
PR SWING/16576
* javax/swing/JLayeredPane.java
(setLayer): Permit changing layer after addition.
(setPosition): Permit over-length positions.
(layerToRange): Compare intValue()s.
* javax/swing/Box.java (createHorizontalBox): Implement.
(createRigidArea): Likewise.
(createVerticalBox): Likewise.
2004-08-31 Kim Ho <kho@redhat.com>
* java/awt/Component.java:
(processMouseEvent): Consume event after
listeners process it.
(processMouseMotionEvent): ditto.
(processMouseWheelEvent): ditto.
* java/awt/Container.java:
(acquireComponentForMouseEvent):
Do not dispatch to events that have been
removed from the Container.
(handleEvent): Consume the MouseEvents.
* javax/swing/RepaintManager.java:
(paintDirtyRegions): Do not add to list of
damaged areas if the component has no root.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/plaf/basic/BasicMenuItemUI.java: Clean ip imports.
2004-08-31 Mark Wielaard <mark@klomp.org>
* gnu/java/awt/peer/gtk/GtkToolkit.java (getFontPeer): Don't return
null when a MissingResourceException is thrown. Should never happen.
2004-08-31 Mark Wielaard <mark@klomp.org>
* java/awt/EventQueue.java (postEvent): Throw NullPointerException
when argument is null.
2004-08-31 Mark Wielaard <mark@klomp.org>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_addExposeFilter):
Define hid at start of function.
(Java_gnu_java_awt_peer_gtk_GtkComponentPeer_removeExposeFilter):
Likewise.
2004-08-31 Mark Wielaard <mark@klomp.org>
* gnu/java/awt/EmbeddedWindow.java: Reindent.
* javax/swing/JButton.java: Reindent.
* javax/swing/JCheckBox.java: Reindent.
2004-08-31 Mark Wielaard <mark@klomp.org>
* Makefile.am (gtk_c_source_files): Added
jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c.
(gtk_awt_peer_sources): Added
gnu/java/awt/peer/gtk/GThreadMutex.java and
gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java.
* Makefile.in: Regenerated.
2004-08-31 Archie Cobbs <archie@dellroad.org>
* jni/gtk-peer/gthread-jni.c: don't #include nonexistent files
2004-08-31 Steven Augart <augart@watson.ibm.com>
* jni/gtk-peer/gthread-jni.c (c-font-lock-extra-types):
Added jfieldID, jmethodID.
2004-08-31 Mark Wielaard <mark@klomp.org>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
(Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit): Initialize
gdk_env before calling any gdk or gtk function.
* gnu/java/awt/peer/gtk/GtkMainThread.java (gtkInitCalled): New field.
(GtkMainThread): Call wait() in while loop waiting for gtkInitCalled.
(run): Set gtkInitCalled.
2004-08-31 Steven Augart <augart@watson.ibm.com>
* gnu/java/awt/peer/gtk/GtkMainThread.java (run): Pass the value of
the gnu.classpath.awt.gtk.portable.native.sync system property to C.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
(Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit): New argument,
portableNativeSync. Delegate PORTABLE_NATIVE_SYNC work to
init_glib_threads.
(init_glib_threads): New function.
2004-08-31 Mark Wielaard <mark@klomp.org>
* jni/gtk-peer/gthread-jni.c: Define MIN_, MAX_ and NORM_
PRIORITY when not already defined in header file.
2004-08-31 Mark Wielaard <mark@klomp.org>
* jni/gtk-peer/gthread-jni.c (setup_cache): Call
ExceptionOccurred, not ExceptionCheck, when we don't have JNI 1.2.
2004-08-31 Steven Augart <augart@watson.ibm.com>
* gnu/native/jni/gtk-peer/gthread-jni.c: Indentation fixes.
Implemented missing functions for GTK2.
Added error handling.
Renamed static functions out of the g_ namespace.
Added TRACE_API_CALLS, EXPLAIN_TROUBLE, EXPLAIN_BROKEN,
EXPLAIN_BADLY_BROKEN, and DELETE_LOCAL_REFS options.
Rewrote global-reference code.
Eliminated cascading errors.
(mutex_trylock_jni_impl) Fully implemented.
(cond_timed_wait_jni_impl) Went from millisecond to microsecond
resolution.
(setup_cache) New function.
(mutex_cond_wait_jni_impl, mutex_cond_timed_wait_jni_impl) Fixed
bug where they were not unlocking the GMutex associated with the
condition variable during the wait on that condition variable.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,
native/jni/gtk-peer/gthread-jni.c,
native/jni/gtk-peer/gthread-jni.h
(g_thread_jni_functions): Renamed to ...
(portable_native_sync_jni_functions): this name.
(gdk_vm): Renamed to...
(the_vm): this name.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
(gdk_vm): Removed duplicate definition.
(gtkInit): Removed stray message to stdout.
(gtkInit): Use g_malloc and g_free instead of malloc and free.
(gtkInit): Fix a const assignment bug.
(gtkInit): Simplified code.
* gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java,
native/jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c,
native/jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.h,
gnu/java/awt/peer/gtk/GThreadMutex.java:
New files.
2004-08-31 Mark Wielaard <mark@klomp.org>
* javax/swing/Box.java: Put FIXME comment above class declaration.
* javax/swing/JButton.java: Remove illegal L&F HTML from comments.
* javax/swing/JCheckBox.java: Likewise.
* javax/swing/JDialog.java: Likewise.
* javax/swing/JRadioButton.java: Likewise.
* javax/swing/JToggleButton.java: Likewise.
* javax/swing/UIManager.java: Likewise.
* javax/swing/border/TitledBorder.java: Likewise.
* javax/swing/plaf/basic/BasicLabelUI.java: Likewise.
* javax/swing/plaf/basic/BasicLookAndFeel.java: Likewise.
* javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java: Likewise.
* javax/swing/plaf/basic/BasicProgressBarUI.java: Likewise.
* javax/swing/plaf/basic/BasicScrollBarUI.java: Likewise.
* javax/swing/plaf/basic/BasicSeparatorUI.java: Likewise.
* javax/swing/text/JTextComponent.java: Likewise.
2004-08-31 David Jee <djee@redhat.com>
PR AWT/16682
* gnu/java/awt/peer/gtk/GtkFramePeer.java
(setIconImage): Add a FIXME for unhandled cases.
2004-08-31 Thomas Fitzsimmons <fitzsim@redhat.com>
PR AWT/16040
* gnu/awt/LightweightRedirector.java: Call getModifiersEx, not
getModifiers. Replace old button masks with new ones.
* gnu/awt/xlib/XEventLoop.java: Likewise.
* gnu/java/awt/peer/gtk/GtkButtonPeer.java: Likewise.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Likewise.
* gnu/java/awt/peer/gtk/GtkListPeer.java: Likewise.
* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java: Likewise.
* java/awt/AWTKeyStroke.java: Remove old modifier masks.
* java/awt/Component.java: Replace old modifier masks with new
ones.
* java/awt/Container.java: Call getModifiersEx, not
getModifiers.
* java/awt/DefaultKeyboardFocusManager.java: Likewise. Remove
old modifier masks.
* javax/swing/JMenuItem.java: Replace old button masks with new
ones.
* javax/swing/KeyStroke.java: Call getModifiersEx, not
getModifiers.
* javax/swing/SwingUtilities.java: Likewise.
* javax/swing/plaf/basic/BasicButtonListener.java: Likewise.
* javax/swing/plaf/basic/BasicInternalFrameUI.java: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c: Replace old
mask macros with new ones.
* jni/gtk-peer/gtkpeer.h: Replace old button and modifier mask
macros with new ones representing new masks.
2004-08-31 Craig Black <craig.black@aonix.com>
* gnu/java/awt/peer/gtk/GdkGraphics.java
(drawRoundRect): Implemented.
(fillRoundRect): Implemented.
* gnu/java/awt/peer/gtk/GdkGraphics2D.java
(drawRoundRect): Reimplemented to match GdkGraphics.
(fillRoundRect): Reimplemented to match GdkGraphics.
2004-08-31 Mark Wielaard <mark@klomp.org>
* Makefile.in: Regenerated.
2004-08-31 Michael Koch <konqueror@gmx.de>
* gnu/java/awt/EmbeddedWindow.java
(addNotify): Use AccessController to allow execution of privileged
code.
2004-08-31 Michael Koch <konqueror@gmx.de>
* gnu/java/awt/EmbeddedWindow.java
(static): Removed.
(addNotify): Set peer via reflection.
(setWindowPeer): Removed.
* gnu/java/awt/natEmbeddedWindow.cc: Removed.
* Makefile.am (nat_source_files):
Removed gnu/java/awt/natEmbeddedWindow.cc.
2004-08-31 Bryce McKinlay <mckinlay@redhat.com>
* Makefile.am: Add gnu/java/security/action/GetPropertyAction.java
and gnu/java/security/action/SetAccessibleAction.java.
2004-08-31 Bryce McKinlay <mckinlay@redhat.com>
* gnu/java/security/action/GetPropertyAction.java (setParameters):
Renamed from 'setName'. New 2-argument form with default value.
(run): Pass default 'value' parameter to System.getProperty().
* gnu/java/security/action/SetAccessibleAction.java: Fix javadoc
typos.
2004-08-31 Bryce McKinlay <mckinlay@redhat.com>
* gnu/java/security/action/GetPropertyAction.java: New class.
* gnu/java/security/action/SetAccessibleAction.java: New class.
2004-08-31 David Jee <djee@redhat.com>
* gnu/java/awt/peer/gtk/GtkFramePeer.java
(setIconImage): Check if image is null.
2004-08-31 David Jee <djee@redhat.com>
* gnu/java/awt/peer/gtk/GtkFramePeer.java
(create): Set the icon image.
(nativeSetIconImage): New native method declaration.
(setIconImage): Implement.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(nativeSetIconImage): New function.
2004-08-31 Dalibor Topic <robilad@kaffe.org>
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
(filenameFilterCallback): Declare local variable accepted before use.
2004-08-31 Dalibor Topic <robilad@kaffe.org>
* gnu/java/awt/ComponentDataBlitOp.java:
Cleaned up imports.
2004-08-31 Tom Tromey <tromey@redhat.com>
* gnu/java/awt/peer/GLightweightPeer.java,
gnu/java/awt/peer/gtk/GdkGraphics2D.java,
gnu/java/awt/peer/gtk/GtkComponentPeer.java,
javax/swing/JScrollPane.java: Removed
redundant imports.
2004-08-31 David Jee <djee@redhat.com>
* java/awt/DefaultKeyboardFocusManager.java
(postProcessKeyEvent): Only activate MenuShortcuts on KEY_PRESSED
event. Fix shift modifier checking.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
(accel_attach): Remove.
(setupAccelGroup): Remove calls to accel_attach.
2004-08-31 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkArg.java: Remove file.
* gnu/java/awt/peer/gtk/GtkArgList.java: Remove file.
* Makefile.am (gtk_awt_peer_sources): Remove GtkArg.java and
GtkArgList.java.
(gtk_c_files): Use CAIRO_CFLAGS and PANGOFT2_CFLAGS, not _LIBS.
* Makefile.in: Regenerate.
* gnu/java/awt/peer/gtk/GtkButtonPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
(create(String)): New method.
(create): Call new create method.
(getArgs): Remove method.
* gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
(nativeCreate): Rename to create.
(gtkSetLabel): Rename to gtkButtonSetLabel.
(gtkToggleButtonSetActive): New method.
(create): Call gtkToggleButtonSetActive and gtkButtonSetLabel.
(setState): Replace set call with gtkToggleButtonSetActive.
(setLabel): Replace gtkSetLabel call with gtkButtonSetLabel.
(getArgs): Remove method.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(gtkWidgetSetSensitive): New method.
(gtkWidgetSetParent): Likewise.
(GtkComponentPeer): Call setParent, setComponentBounds and
setVisibleAndEnabled.
(setParent): New method.
(setComponentBounds): New method.
(setVisibleAndEnabled): New method.
(setEnabled): Call gtkWidgetSetSensitive.
(getArgs): Remove method.
Remove all set methods.
* gnu/java/awt/peer/gtk/GtkDialogPeer.java (create): Call
gtkWindowSetModal, setTitle and setResizable.
(getArgs): Remove method.
* gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
(setComponentBounds): New method.
* gnu/java/awt/peer/gtk/GtkFramePeer.java (setResizable):
Replace set call with gtkWindowSetResizable.
(getArgs): Remove method.
(create): Call setTitle and setResizable.
* gnu/java/awt/peer/gtk/GtkWindowPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(gtkWindowSetTitle): New method.
(gtkWindowSetResizable): New method.
(gtkWindowSetModal): New method.
(setParent): New method.
(setVisibleAndEnabled): New method.
(getArgs): Remove method.
(setTitle): Call gtkWindowSetTitle.
(setResizable): Call gtkWindowSetResizable.
* jni/gtk-peer/gtkpeer.h [DEBUG_LOCKING]: New define to turn on
and off locking instrumentation.
2004-08-31 Kim Ho <kho@redhat.com>
* Makefile.am: Add new file.
* Makefile.in: Regenerate.
* gcj/Makefile.in: Regenerate
* include/Makefile.in:
* java/awt/Container.java:
(acquireComponentForMouseEvent): Respect
the event mask when looking for candidate.
* javax/swing/JComponent.java:
Remove toolTip field.
(createToolTip): Create a tooltip on demand.
(setToolTipText): Register with the ToolTipManager.
(getToolTipText(MouseEvent)): Return getToolTipText().
* javax/swing/JToolTip.java: Implement.
* javax/swing/Timer.java: Jalopy.
(restart): Call stop, then start.
(stop): Interrupt the timer rather than wait for
the timer to come to a stop naturally.
* javax/swing/ToolTipManager.java: Implement.
* javax/swing/plaf/basic/BasicLookAndFeel.java:
Change ToolTip.background color.
* javax/swing/plaf/basic/BasicToolTipUI.java:
Implement.
* testsuite/Makefile.in: Regenerate
2004-08-31 Jerry Quinn <jlquinn@optonline.net>
* java/awt/image/DirectColorModel.java (DirectColorModel): Fix
constructor param comments.
2004-08-31 Thomas Fitzsimmons <fitzsim@redhat.com>
* java/awt/Component.java: Document AWT 1.0 event handler
methods.
2004-08-31 Roman Kennke <roman@ontographics.com>
* javax/swing/Box.java:
(createGlue): Implemented
(createHorizontalGlue): Implemented
(createHorizontalStrut): Implemented
(createVerticalGlue): Implemented
(createVerticalStrut): Implemented
2004-08-31 David Jee <djee@redhat.com>
* gnu/java/awt/peer/gtk/GtkChoicePeer.java
(GtkChoicePeer): Do not automatically select first item.
(getHistory): Remove.
(nativeGetSelected): New method.
(nativeRemoveAll): New method.
(add): Use nativeGetSelected() instead of getHistory().
(remove): Likewise.
(removeAll): Call nativeRemoveAll().
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
(create): Migrate to GtkComboBox.
(append): Likewise.
(nativeAdd): Likewise.
(nativeRemove): Likewise.
(select): Likewise.
(nativeRemoveAll): New method.
(nativeGetSelected): New method.
(selection_changed): New method.
(getHistory): Remove.
(item_activate): Remove.
(item_removed): Remove.
(connect_choice_item_selectable_hook): Remove.
2004-08-31 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java (create): Use tf
variable in setEditable call.
* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
(gtkWidgetSetBackground): New method.
(gtkWidgetSetForeground): Likewise.
(create): Set peer's editable state based on awtComponent's.
* java/awt/Button.java (Button()): Use empty string rather than
null in no-label constructor.
2004-08-31 Roman Kennke <roman@ontographics.com>
* javax/swing/BoxLayout.java: Reimplement.
2004-08-31 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GdkGraphics.java,
gnu_java_awt_peer_gtk_GdkGraphics.c
(initState(GtkComponentPeer)): Don't return array of colour
values.
(GdkGraphics(int,int)): Set default font to size 12.
(GdkGraphics(GtkComponentPeer)): Set graphics colour to
component's foreground colour.
* gnu/java/awt/peer/gtk/GdkGraphics2D.java,
gnu_java_awt_peer_gtk_GdkGraphics2D.c
(initState(GtkComponentPeer)): Don't return array of colour
values.
(GdkGraphics2D(GtkComponentPeer)): Set foreground and background
colours to component's colours.
(current_colors_of_widget): Remove function.
* gnu/java/awt/peer/gtk/GtkOffScreenImage.java (getGraphics):
Return a new graphics object.
* java/awt/Font.java (toString): Fix format.
* java/awt/Graphics.java (toString): Likewise.
2004-08-31 Craig Black <craig.black@aonix.com>
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
(addTearOff): New function.
* gnu/java/awt/peer/gtk/GtkMenuPeer.java (addTearOff):
New native method.
(init): Call addTearOff() when menu.isTearOff().
2004-08-31 Bryce McKinlay <mckinlay@redhat.com>
* gnu/java/awt/ClasspathToolkit.java (createImageProducer): New.
Default implementation.
* gnu/java/awt/peer/gtk/GtkToolkit.java (createImageProducer): New.
Implement using GdkPixbufDecoder.
2004-08-31 David Jee <djee@redhat.com>
* gnu/java/awt/peer/gtk/GtkComponentPeer.java
(GtkComponentPeer): Use gtkWidgetGetPreferredDimensions() for
setting the size of GtkFileDialogPeers.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(gtkWidgetGetPreferredDimensions): For widgets extending GtkWindow,
use their default sizes rather than their natural requisitions.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/JFormattedTextField.java
(JFormattedTextField): Implemented.
* javax/swing/text/DefaultEditorKit.java
(BeepAction): New inner class.
* javax/swing/text/Segment.java
(partialReturn): New field.
(setPartialReturn): New method.
(isPartialReturn): Likewise.
* javax/swing/text/View.java
(createFragment): Fixed typo.
(getStartOffset): New method.
(getEndOffset): Likewise.
2004-08-31 Michael Koch <konqueror@gmx.de>
* javax/swing/table/DefaultTableColumnModel.java
(serialVersionUID): Made private.
(listenerList): Initialize.
(changeEvent): Initialize.
* javax/swing/table/JTableHeader.java
(JTableHeader): New constructors.
(createDefaultColumnModel): New method.
* javax/swing/table/TableColumn.java
(setHeaderRenderer): Simplified code.
(setCellRenderer): Likewise.
(setWidth): Likewise.
From-SVN: r86956
Diffstat (limited to 'libjava/javax/swing/JTable.java')
-rw-r--r-- | libjava/javax/swing/JTable.java | 1388 |
1 files changed, 1278 insertions, 110 deletions
diff --git a/libjava/javax/swing/JTable.java b/libjava/javax/swing/JTable.java index c628b71..4a81e04 100644 --- a/libjava/javax/swing/JTable.java +++ b/libjava/javax/swing/JTable.java @@ -39,12 +39,14 @@ exception statement from your version. */ package javax.swing; import java.awt.Color; +import java.awt.Component; import java.awt.Dimension; import java.awt.Rectangle; import java.util.Vector; import java.util.Hashtable; import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ListSelectionEvent; @@ -53,11 +55,14 @@ import javax.swing.event.TableColumnModelEvent; import javax.swing.event.TableColumnModelListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; +import javax.swing.plaf.TableUI; import javax.swing.table.DefaultTableColumnModel; +import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; @@ -66,34 +71,259 @@ public class JTable extends JComponent ListSelectionListener, CellEditorListener, Accessible { private static final long serialVersionUID = 3876025080382781659L; - - public static final int AUTO_RESIZE_ALL_COLUMNS = 4; - public static final int AUTO_RESIZE_LAST_COLUMN = 3; - public static final int AUTO_RESIZE_NEXT_COLUMN = 1; + + + /** + * When resizing columns, do not automatically change any columns. In this + * case the table should be enclosed in a {@link JScrollPane} in order to + * accomodate cases in which the table size exceeds its visible area. + */ public static final int AUTO_RESIZE_OFF = 0; + + /** + * When resizing column <code>i</code>, automatically change only the + * single column <code>i+1</code> to provide or absorb excess space + * requirements. + */ + public static final int AUTO_RESIZE_NEXT_COLUMN = 1; + + /** + * When resizing column <code>i</code> in a table of <code>n</code> + * columns, automatically change all columns in the range <code>[i+1, + * n)</code>, uniformly, to provide or absorb excess space requirements. + */ public static final int AUTO_RESIZE_SUBSEQUENT_COLUMNS = 2; - protected boolean autoCreateColumnsFromModel; - protected int autoResizeMode; - protected TableCellEditor cellEditor; - protected boolean cellSelectionEnabled; - protected TableColumnModel columnModel; - protected TableModel dataModel; + /** + * When resizing column <code>i</code> in a table of <code>n</code> + * columns, automatically change all columns in the range <code>[0, + * n)</code> (with the exception of column i) uniformly, to provide or + * absorb excess space requirements. + */ + public static final int AUTO_RESIZE_ALL_COLUMNS = 4; + + /** + * When resizing column <code>i</code> in a table of <code>n</code> + * columns, automatically change column <code>n-1</code> (the last column + * in the table) to provide or absorb excess space requirements. + */ + public static final int AUTO_RESIZE_LAST_COLUMN = 3; + + + /** + * A table mapping {@link java.lang.Class} objects to + * {@link TableCellEditor} objects. This table is consulted by the + * + */ protected Hashtable defaultEditorsByColumnClass; protected Hashtable defaultRenderersByColumnClass; protected int editingColumn; protected int editingRow; - protected Color gridColor; - protected Dimension preferredViewportSize; + + /** + * Whether or not the table should automatically compute a matching + * {@link TableColumnModel} and assign it to the {@link #columnModel} + * property when the {@link #dataModel} property is changed. + * + * @see #setModel() + * @see #createColumnsFromModel() + * @see #setColumnModel() + * @see #setAutoCreateColumnsFromModel() + * @see #getAutoCreateColumnsFromModel() + */ + protected boolean autoCreateColumnsFromModel; + + /** + * A numeric code specifying the resizing behavior of the table. Must be + * one of {@link #AUTO_RESIZE_ALL_COLUMNS} (the default), {@link + * #AUTO_RESIZE_LAST_COLUMN}, {@link #AUTO_RESIZE_NEXT_COLUMN}, {@link + * #AUTO_RESIZE_SUBSEQUENT_COLUMNS}, or {@link #AUTO_RESIZE_OFF}. + * + * @see #doLayout() + * @see #setAutoResizeMode() + * @see #getAutoResizeMode() + */ + protected int autoResizeMode; + + /** + * The height in pixels of any row of the table. All rows in a table are + * of uniform height. This differs from column width, which varies on a + * per-column basis, and is stored in the individual columns of the + * {@link #columnModel}. + * + * @see #getRowHeight() + * @see #setRowHeight() + * @see TableColumn#getWidth() + * @see TableColumn#setWidth() + */ protected int rowHeight; + + /** + * The height in pixels of the gap left between any two rows of the table. + * + * @see #setRowMargin() + * @see #getRowHeight() + * @see #getInterCellSpacing() + * @see #setInterCellSpacing() + * @see TableColumnModel#getColumnMargin() + * @see TableColumnModel#setColumnMargin() + */ protected int rowMargin; + + /** + * Whether or not the table should allow row selection. If the table + * allows both row <em>and</em> column selection, it is said to allow + * "cell selection". Previous versions of the JDK supported cell + * selection as an independent concept, but it is now represented solely + * in terms of simultaneous row and column selection. + * + * @see TableColumnModel#columnSelectionAllowed() + * @see #setRowSelectionAllowed() + * @see #getRowSelectionAllowed() + * @see #getCellSelectionEnabled() + * @see #setCellSelectionEnabled() + */ protected boolean rowSelectionAllowed; - protected Color selectionBackground; - protected Color selectionForeground; + + /** + * @deprecated Use {@link #rowSelectionAllowed}, {@link + * #columnSelectionAllowed}, or the combined methods {@link + * getCellSelectionEnabled} and {@link setCellSelectionEnabled}. + */ + protected boolean cellSelectionEnabled; + + /** + * The model for data stored in the table. Confusingly, the published API + * requires that this field be called <code>dataModel</code>, despite its + * property name. The table listens to its model as a {@link + * TableModelListener}. + * + * @see #tableChanged() + * @see TableModel#addTableModelListener() + */ + protected TableModel dataModel; + + /** + * <p>A model of various aspects of the columns of the table, <em>not + * including</em> the data stored in them. The {@link TableColumnModel} + * is principally concerned with holding a set of {@link TableColumn} + * objects, each of which describes the display parameters of a column + * and the numeric index of the column from the data model which the + * column is presenting.</p> + * + * <p>The TableColumnModel also contains a {@link ListSelectionModel} which + * indicates which columns are currently selected. This selection model + * works in combination with the {@link selectionModel} of the table + * itself to specify a <em>table selection</em>: a combination of row and + * column selections.</p> + * + * <p>Most application programmers do not need to work with this property + * at all: setting {@link #autoCreateColumnsFromModel} will construct the + * columnModel automatically, and the table acts as a facade for most of + * the interesting properties of the columnModel anyways.</p> + * + * @see #setColumnModel() + * @see #getColumnModel() + */ + protected TableColumnModel columnModel; + + /** + * A model of the rows of this table which are currently selected. This + * model is used in combination with the column selection model held as a + * member of the {@link columnModel} property, to represent the rows and + * columns (or both: cells) of the table which are currently selected. + * + * @see #rowSelectionAllowed + * @see #setSelectionModel() + * @see #getSelectionModel() + * @see TableColumnModel#getSelectionModel() + * @see ListSelectionModel#addListSelectionListener() + */ protected ListSelectionModel selectionModel; + + /** + * The accessibleContext property. + */ + protected AccessibleContext accessibleContext; + + /** + * The current cell editor. + */ + protected TableCellEditor cellEditor; + + /** + * Whether or not drag-and-drop is enabled on this table. + * + * @see #setDragEnabled() + * @see #getDragEnabled() + */ + protected boolean dragEnabled; + + /** + * The color to paint the grid lines of the table, when either {@link + * #showHorizontalLines} or {@link #showVerticalLines} is set. + * + * @see #setGridColor() + * @see #getGridColor() + */ + protected Color gridColor; + + /** + * The size this table would prefer its viewport assume, if it is + * contained in a {@link JScrollPane}. + * + * @see #setPreferredScrollableViewportSize() + * @see #getPreferredScrollableViewportSize() + */ + protected Dimension preferredScrollableViewportSize; + + /** + * The color to paint the background of selected cells. Fires a property + * change event with name {@link #SELECTION_BACKGROUND_CHANGED_PROPERTY} + * when its value changes. + * + * @see #setSelectionBackground() + * @see #getSelectionBackground() + */ + Color selectionBackground; + + /** + * The name carried in property change events when the {@link + * #selectionBackground} property changes. + */ + private static final String SELECTION_BACKGROUND_CHANGED_PROPERTY = "selectionBackground"; + + /** + * The color to paint the foreground of selected cells. Fires a property + * change event with name {@link #SELECTION_FOREGROUND_CHANGED_PROPERTY} + * when its value changes. + * + * @see #setSelectionForeground() + * @see #getSelectionForeground() + */ + Color selectionForeground; + + /** + * The name carried in property change events when the + * {@link #selectionForeground} property changes. + */ + private static final String SELECTION_FOREGROUND_CHANGED_PROPERTY = "selectionForeground"; + + /** + * The showHorizontalLines property. + */ protected boolean showHorizontalLines; + + /** + * The showVerticalLines property. + */ protected boolean showVerticalLines; + + /** + * The tableHeader property. + */ protected JTableHeader tableHeader; + /** * Creates a new <code>JTable</code> instance. @@ -156,8 +386,33 @@ public class JTable extends JComponent public JTable (TableModel dm, TableColumnModel cm, ListSelectionModel sm) { this.dataModel = dm == null ? createDefaultDataModel() : dm; - this.columnModel = cm == null ? createDefaultColumnModel() : cm; - this.selectionModel = sm == null ? createDefaultListSelectionModel() : sm; + setSelectionModel(sm == null ? createDefaultListSelectionModel() : sm); + + this.columnModel = cm; + this.autoCreateColumnsFromModel = false; + if (cm == null) + { + this.autoCreateColumnsFromModel = true; + createColumnsFromModel(); + } + this.columnModel.addColumnModelListener(this); + + this.defaultRenderersByColumnClass = new Hashtable(); + this.defaultEditorsByColumnClass = new Hashtable(); + + this.autoResizeMode = AUTO_RESIZE_ALL_COLUMNS; + this.rowHeight = 16; + this.rowMargin = 1; + this.rowSelectionAllowed = true; + // this.accessibleContext = new AccessibleJTable(); + this.cellEditor = null; + this.dragEnabled = false; + this.preferredScrollableViewportSize = new Dimension(450,400); + this.showHorizontalLines = true; + this.showVerticalLines = true; + setInterCellSpacing(new Dimension(1,1)); + setTableHeader(new JTableHeader(columnModel)); + updateUI(); } /** @@ -178,216 +433,1129 @@ public class JTable extends JComponent { return new JScrollPane(table); } + + protected TableColumnModel createDefaultColumnModel() + { + return new DefaultTableColumnModel(); + } - public void clearSelection() + protected TableModel createDefaultDataModel() { - selectionModel.clearSelection(); + return new DefaultTableModel(); } + protected ListSelectionModel createDefaultListSelectionModel() + { + return new DefaultListSelectionModel(); + } + + private void createColumnsFromModel() + { + if (dataModel == null) + return; + + TableColumnModel cm = createDefaultColumnModel(); + + for (int i = 0; i < dataModel.getColumnCount(); ++i) + { + cm.addColumn(new TableColumn(i)); + } + this.setColumnModel(cm); + } + + // listener support + public void columnAdded (TableColumnModelEvent event) { - throw new Error ("Not implemented"); + revalidate(); + repaint(); } public void columnMarginChanged (ChangeEvent event) { - throw new Error ("Not implemented"); + revalidate(); + repaint(); } - + public void columnMoved (TableColumnModelEvent event) { - throw new Error ("Not implemented"); + revalidate(); + repaint(); } - + public void columnRemoved (TableColumnModelEvent event) { - throw new Error ("Not implemented"); + revalidate(); + repaint(); } public void columnSelectionChanged (ListSelectionEvent event) { - throw new Error ("Not implemented"); + repaint(); } - - protected TableColumnModel createDefaultColumnModel() + + public void editingCanceled (ChangeEvent event) { - return new DefaultTableColumnModel(); + repaint(); } - protected TableModel createDefaultDataModel() + public void editingStopped (ChangeEvent event) { - return new DefaultTableModel(); + repaint(); } - protected ListSelectionModel createDefaultListSelectionModel() + public void tableChanged (TableModelEvent event) { - return new DefaultListSelectionModel(); + repaint(); } - public void editingCanceled (ChangeEvent event) + public void valueChanged (ListSelectionEvent event) { - throw new Error ("Not implemented"); + repaint(); } - public void editingStopped (ChangeEvent event) + + /** + * Calculate the visible rectangle for a particular row and column. The + * row and column are specified in visual terms; the column may not match + * the {@link #dataModel} column. + * + * @param row the visible row to get the cell rectangle of + * + * @param column the visible column to get the cell rectangle of, which may + * differ from the {@link #dataModel} column + * + * @param includeSpacing whether or not to include the cell margins in the + * resulting cell. If <code>false</code>, the result will only contain the + * inner area of the target cell, not including its margins. + * + * @return a rectangle enclosing the specified cell + */ + public Rectangle getCellRect(int row, + int column, + boolean includeSpacing) { - throw new Error ("Not implemented"); + int height = getHeight(); + int width = columnModel.getColumn(column).getWidth(); + int x_gap = columnModel.getColumnMargin(); + int y_gap = rowMargin; + + column = Math.max(0, Math.min(column, getColumnCount() - 1)); + row = Math.max(0, Math.min(row, getRowCount() - 1)); + + int x = 0; + int y = (height + y_gap) * row; + + for (int i = 0; i < column; ++i) + { + x += columnModel.getColumn(i).getWidth(); + x += x_gap; + } + + if (includeSpacing) + return new Rectangle(x, y, width, height); + else + return new Rectangle(x, y, width - x_gap, height - y_gap); } - public TableColumnModel getColumnModel () + public void clearSelection() { - return columnModel; + selectionModel.clearSelection(); + } + + /** + * Get the value of the {@link #selectedRow} property by delegation to + * the {@link ListSelectionModel#getMinSelectionIndex} method of the + * {@link #selectionModel} field. + * + * @return The current value of the selectedRow property + */ + public int getSelectedRow () + { + return selectionModel.getMinSelectionIndex(); } - public TableModel getModel() + /** + * Get the value of the {@link #selectionModel} property. + * + * @return The current value of the property + */ + public ListSelectionModel getSelectionModel() { - return dataModel; + if (! rowSelectionAllowed) + return null; + + return selectionModel; } - public Dimension getPreferredScrollableViewportSize () + public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { - throw new Error ("Not implemented"); + if (orientation == SwingConstants.VERTICAL) + return visibleRect.height * direction; + else + return visibleRect.width * direction; } - public int getScrollableBlockIncrement (Rectangle visibleRect, int orientation, int direction) + /** + * Get the value of the {@link #scrollableTracksViewportHeight} property. + * + * @return The constant value <code>false</code> + */ + + public boolean getScrollableTracksViewportHeight() { - throw new Error ("Not implemented"); + return false; } + + /** + * Get the value of the {@link #scrollableTracksViewportWidth} property. + * + * @return <code>true</code> unless the {@link autoResizeMode} prperty is + * <code>AUTO_RESIZE_OFF</code> + */ - public boolean getScrollableTracksViewportHeight () + public boolean getScrollableTracksViewportWidth() { - throw new Error ("Not implemented"); + if (autoResizeMode == AUTO_RESIZE_OFF) + return false; + else + return true; } - - public boolean getScrollableTracksViewportWidth () + + public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { - throw new Error ("Not implemented"); + // FIXME: I don't exactly know what sun does here. in both cases they + // pick values which do *not* simply expose the next cell in a given + // scroll direction. + + if (orientation == SwingConstants.VERTICAL) + return rowHeight; + else + { + int sum = 0; + for (int i = 0; i < getColumnCount(); ++i) + sum += columnModel.getColumn(0).getWidth(); + return getColumnCount() == 0 ? 10 : sum / getColumnCount(); + } } - public int getScrollableUnitIncrement (Rectangle visibleRect, int orientation, int direction) + + public TableCellEditor getCellEditor(int row, int column) { - throw new Error ("Not implemented"); + TableCellEditor editor = columnModel.getColumn(column).getCellEditor(); + + if (editor == null) + editor = getDefaultEditor(dataModel.getColumnClass(column)); + + return editor; } - public int getSelectedRow () + public TableCellEditor getDefaultEditor(Class columnClass) { - return selectionModel.getMinSelectionIndex(); + if (defaultEditorsByColumnClass.containsKey(columnClass)) + return (TableCellEditor) defaultEditorsByColumnClass.get(columnClass); + else + { + TableCellEditor r = new DefaultCellEditor(new JTextField()); + defaultEditorsByColumnClass.put(columnClass, r); + return r; + } } - - public ListSelectionModel getSelectionModel () + + + + public TableCellRenderer getCellRenderer(int row, int column) { - if (! rowSelectionAllowed) - return null; + TableCellRenderer renderer = + columnModel.getColumn(column).getCellRenderer(); + + if (renderer == null) + renderer = getDefaultRenderer(dataModel.getColumnClass(column)); + + return renderer; + } - return selectionModel; + public TableCellRenderer getDefaultRenderer(Class columnClass) + { + if (defaultRenderersByColumnClass.containsKey(columnClass)) + return (TableCellRenderer) defaultRenderersByColumnClass.get(columnClass); + else + { + TableCellRenderer r = new DefaultTableCellRenderer(); + defaultRenderersByColumnClass.put(columnClass, r); + return r; + } } - public void tableChanged (TableModelEvent event) + public int convertColumnIndexToModel(int vc) { - throw new Error ("Not implemented"); + if (vc < 0) + return vc; + else if (vc > getColumnCount()) + return -1; + else + return columnModel.getColumn(vc).getModelIndex(); } - public void setModel (TableModel model) + public int convertColumnIndexToView(int mc) { - if (model == null) - throw new IllegalArgumentException(); + if (mc < 0) + return mc; + int ncols = getColumnCount(); + for (int vc = 0; vc < ncols; ++vc) + { + if (columnModel.getColumn(vc).getModelIndex() == mc) + return vc; + } + return -1; + } - // FIXME: Should we deregister from old model ? + public Component prepareRenderer(TableCellRenderer renderer, + int row, + int column) + { + boolean rsa = getRowSelectionAllowed(); + boolean csa = getColumnSelectionAllowed(); + boolean rs = rsa ? getSelectionModel().isSelectedIndex(row) : false; + boolean cs = csa ? columnModel.getSelectionModel().isSelectedIndex(column) : false; + boolean isSelected = ((rsa && csa && rs && cs) + || (rsa && !csa && rs) + || (!rsa && csa && cs)); - dataModel = model; - dataModel.addTableModelListener(this); + return renderer.getTableCellRendererComponent(this, + dataModel.getValueAt(row, + convertColumnIndexToView(column)), + isSelected, + false, // hasFocus + row, column); } - public void setSelectionMode (int selectionMode) + + /** + * Get the value of the {@link #autoCreateColumnsFromModel} property. + * + * @return The current value of the property + */ + public boolean getAutoCreateColumnsFromModel() { - throw new Error ("Not implemented"); + return autoCreateColumnsFromModel; } - public void setSelectionModel (ListSelectionModel model) + /** + * Get the value of the {@link #autoResizeMode} property. + * + * @return The current value of the property + */ + public int getAutoResizeMode() { - if (model == null) - throw new IllegalArgumentException(); + return autoResizeMode; + } - // FIXME: Should we deregister from old model ? - - selectionModel = model; - selectionModel.addListSelectionListener(this); + /** + * Get the value of the {@link #rowHeight} property. + * + * @return The current value of the property + */ + public int getRowHeight() + { + return rowHeight; } - public void setShowGrid (boolean showGrid) + /** + * Get the value of the {@link #rowMargin} property. + * + * @return The current value of the property + */ + public int getRowMargin() { - throw new Error ("Not implemented"); + return rowMargin; } - public void valueChanged (ListSelectionEvent event) + /** + * Get the value of the {@link #rowSelectionAllowed} property. + * + * @return The current value of the property + */ + public boolean getRowSelectionAllowed() + { + return rowSelectionAllowed; + } + + /** + * Get the value of the {@link #cellSelectionEnabled} property. + * + * @return The current value of the property + */ + public boolean getCellSelectionEnabled() + { + return getColumnSelectionAllowed() && getRowSelectionAllowed(); + } + + /** + * Get the value of the {@link #dataModel} property. + * + * @return The current value of the property + */ + public TableModel getModel() { - throw new Error ("Not implemented"); + return dataModel; } + /** + * Get the value of the {@link #columnCount} property by + * delegation to the @{link #dataModel} field. + * + * @return The current value of the columnCount property + */ + public int getColumnCount() + { + return dataModel.getColumnCount(); + } + + /** + * Get the value of the {@link #rowCount} property by + * delegation to the @{link #dataModel} field. + * + * @return The current value of the rowCount property + */ + public int getRowCount() + { + return dataModel.getRowCount(); + } + + /** + * Get the value of the {@link #columnModel} property. + * + * @return The current value of the property + */ + public TableColumnModel getColumnModel() + { + return columnModel; + } + + /** + * Get the value of the {@link #selectedColumn} property by + * delegation to the @{link #columnModel} field. + * + * @return The current value of the selectedColumn property + */ + public int getSelectedColumn() + { + return columnModel.getSelectionModel().getMinSelectionIndex(); + } + + private static int countSelections(ListSelectionModel lsm) + { + int lo = lsm.getMinSelectionIndex(); + int hi = lsm.getMaxSelectionIndex(); + int sum = 0; + if (lo != -1 && hi != -1) + { + switch (lsm.getSelectionMode()) + { + case ListSelectionModel.SINGLE_SELECTION: + sum = 1; + break; + + case ListSelectionModel.SINGLE_INTERVAL_SELECTION: + sum = hi - lo; + break; + + case ListSelectionModel.MULTIPLE_INTERVAL_SELECTION: + for (int i = lo; i < hi; ++i) + if (lsm.isSelectedIndex(i)) + ++sum; + break; + } + } + return sum; + } + + private static int[] getSelections(ListSelectionModel lsm) + { + int sz = countSelections(lsm); + int [] ret = new int[sz]; + + int lo = lsm.getMinSelectionIndex(); + int hi = lsm.getMaxSelectionIndex(); + int j = 0; + java.util.ArrayList ls = new java.util.ArrayList(); + if (lo != -1 && hi != -1) + { + switch (lsm.getSelectionMode()) + { + case ListSelectionModel.SINGLE_SELECTION: + ret[0] = lo; + break; + + case ListSelectionModel.SINGLE_INTERVAL_SELECTION: + for (int i = lo; i < hi; ++i) + ret[j++] = i; + break; + + case ListSelectionModel.MULTIPLE_INTERVAL_SELECTION: + for (int i = lo; i < hi; ++i) + if (lsm.isSelectedIndex(i)) + ret[j++] = i; + break; + } + } + return ret; + } + + /** + * Get the value of the {@link #selectedColumnCount} property by + * delegation to the @{link #columnModel} field. + * + * @return The current value of the selectedColumnCount property + */ + public int getSelectedColumnCount() + { + return countSelections(columnModel.getSelectionModel()); + } + + /** + * Get the value of the {@link #selectedColumns} property by + * delegation to the @{link #columnModel} field. + * + * @return The current value of the selectedColumns property + */ + public int[] getSelectedColumns() + { + return getSelections(columnModel.getSelectionModel()); + } + + /** + * Get the value of the {@link #columnSelectionAllowed} property. + * + * @return The current value of the columnSelectionAllowed property + */ + public boolean getColumnSelectionAllowed() + { + return getColumnModel().getColumnSelectionAllowed(); + } + + /** + * Get the value of the {@link #selectedRowCount} property by + * delegation to the @{link #selectionModel} field. + * + * @return The current value of the selectedRowCount property + */ + public int getSelectedRowCount() + { + return countSelections(selectionModel); + } + + /** + * Get the value of the {@link #selectedRows} property by + * delegation to the @{link #selectionModel} field. + * + * @return The current value of the selectedRows property + */ + public int[] getSelectedRows() + { + return getSelections(selectionModel); + } + + /** + * Get the value of the {@link #accessibleContext} property. + * + * @return The current value of the property + */ + public AccessibleContext getAccessibleContext() + { + return accessibleContext; + } + + /** + * Get the value of the {@link #cellEditor} property. + * + * @return The current value of the property + */ + public TableCellEditor getCellEditor() + { + return cellEditor; + } + + /** + * Get the value of the {@link #dragEnabled} property. + * + * @return The current value of the property + */ + public boolean getDragEnabled() + { + return dragEnabled; + } + + /** + * Get the value of the {@link #gridColor} property. + * + * @return The current value of the property + */ + public Color getGridColor() + { + return gridColor; + } + + /** + * Get the value of the {@link #interCellSpacing} property. + * + * @return The current value of the property + */ + public Dimension getInterCellSpacing() + { + return new Dimension(columnModel.getColumnMargin(), rowMargin); + } + + /** + * Get the value of the {@link #preferredScrollableViewportSize} property. + * + * @return The current value of the property + */ + public Dimension getPreferredScrollableViewportSize() + { + return preferredScrollableViewportSize; + } + + /** + * Get the value of the {@link #selectionBackground} property. + * + * @return The current value of the property + */ + public Color getSelectionBackground() + { + return selectionBackground; + } + + /** + * Get the value of the {@link #selectionForeground} property. + * + * @return The current value of the property + */ + public Color getSelectionForeground() + { + return selectionForeground; + } + + /** + * Get the value of the {@link #showHorizontalLines} property. + * + * @return The current value of the property + */ + public boolean getShowHorizontalLines() + { + return showHorizontalLines; + } + + /** + * Get the value of the {@link #showVerticalLines} property. + * + * @return The current value of the property + */ + public boolean getShowVerticalLines() + { + return showVerticalLines; + } + + /** + * Get the value of the {@link #tableHeader} property. + * + * @return The current value of the property + */ public JTableHeader getTableHeader() { return tableHeader; } - public void setTableHeader(JTableHeader newHeader) + /** + * Set the value of the {@link #autoCreateColumnsFromModel} property. + * + * @param a The new value of the autoCreateColumnsFromModel property + */ + public void setAutoCreateColumnsFromModel(boolean a) { - tableHeader = newHeader; + autoCreateColumnsFromModel = a; } - public boolean getColumnSelectionAllowed() + /** + * Set the value of the {@link #autoResizeMode} property. + * + * @param a The new value of the autoResizeMode property + */ + public void setAutoResizeMode(int a) { - return columnModel.getColumnSelectionAllowed(); + autoResizeMode = a; + revalidate(); + repaint(); } - - public void setColumnSelectionAllowed(boolean flag) + + /** + * Set the value of the {@link #rowHeight} property. + * + * @param r The new value of the rowHeight property + */ + public void setRowHeight(int r) { - columnModel.setColumnSelectionAllowed(flag); + rowHeight = r; + revalidate(); + repaint(); } - public boolean getRowSelectionAllowed() + /** + * Set the value of the {@link #rowMargin} property. + * + * @param r The new value of the rowMargin property + */ + public void setRowMargin(int r) { - return rowSelectionAllowed; + rowMargin = r; + revalidate(); + repaint(); } - - public void setRowSelectionAllowed(boolean flag) + + /** + * Set the value of the {@link #rowSelectionAllowed} property. + * + * @param r The new value of the rowSelectionAllowed property + */ + public void setRowSelectionAllowed(boolean r) { - rowSelectionAllowed = flag; + rowSelectionAllowed = r; + repaint(); } - public int getAutoResizeMode() + /** + * Set the value of the {@link #cellSelectionEnabled} property. + * + * @param c The new value of the cellSelectionEnabled property + */ + public void setCellSelectionEnabled(boolean c) { - return autoResizeMode; + setColumnSelectionAllowed(c); + setRowSelectionAllowed(c); + // for backward-compatibility sake: + cellSelectionEnabled = true; + } + + /** + * <p>Set the value of the {@link #dataModel} property.</p> + * + * <p>Unregister <code>this</code> as a {@link TableModelListener} from + * previous {@link #dataModel} and register it with new parameter + * <code>m</code>.</p> + * + * @param m The new value of the model property + */ + public void setModel(TableModel m) + { + if (m == null) + throw new IllegalArgumentException(); + TableModel tmp = dataModel; + if (autoCreateColumnsFromModel) + createColumnsFromModel(); + if (tmp != null) + tmp.removeTableModelListener(this); + if (m != null) + m.addTableModelListener(this); + dataModel = m; + revalidate(); + repaint(); } - public void setAutoResizeMode(int mode) + /** + * <p>Set the value of the {@link #columnModel} property.</p> + * + * <p>Unregister <code>this</code> as a {@link TableColumnModelListener} + * from previous {@link #columnModel} and register it with new parameter + * <code>c</code>.</p> + * + * @param c The new value of the columnModel property + */ + public void setColumnModel(TableColumnModel c) { - autoResizeMode = mode; + if (c == null) + throw new IllegalArgumentException(); + TableColumnModel tmp = columnModel; + if (tmp != null) + tmp.removeColumnModelListener(this); + if (c != null) + c.addColumnModelListener(this); + columnModel = c; + if (dataModel != null && columnModel != null) + { + int ncols = getColumnCount(); + for (int i = 0; i < ncols; ++i) + columnModel.getColumn(i).setHeaderValue(dataModel.getColumnName(i)); + } + revalidate(); + repaint(); } - public int getColumnCount() + /** + * Set the value of the {@link #columnSelectionAllowed} property. + * + * @param c The new value of the property + */ + public void setColumnSelectionAllowed(boolean c) { - return dataModel.getColumnCount(); + getColumnModel().setColumnSelectionAllowed(c); + repaint(); } - public int getRowCount() + /** + * <p>Set the value of the {@link #selectionModel} property.</p> + * + * <p>Unregister <code>this</code> as a {@link ListSelectionListener} + * from previous {@link #selectionModel} and register it with new + * parameter <code>s</code>.</p> + * + * @param s The new value of the selectionModel property + */ + public void setSelectionModel(ListSelectionModel s) { - return dataModel.getRowCount(); + if (s == null) + throw new IllegalArgumentException(); + ListSelectionModel tmp = selectionModel; + if (tmp != null) + tmp.removeListSelectionListener(this); + if (s != null) + s.addListSelectionListener(this); + selectionModel = s; } - public TableCellRenderer getCellRenderer(int row, int column) + /** + * Set the value of the {@link #selectionMode} property by + * delegation to the {@link #selectionModel} field. + * + * @param s The new value of the property + */ + public void setSelectionMode(int s) { - TableCellRenderer renderer = - columnModel.getColumn(column).getCellRenderer(); - - if (renderer == null) - renderer = getDefaultRenderer(dataModel.getColumnClass(column)); - - return renderer; + selectionModel.setSelectionMode(s); + repaint(); } - public TableCellRenderer getDefaultRenderer(Class columnClass) + /** + * <p>Set the value of the {@link #cellEditor} property.</p> + * + * <p>Unregister <code>this</code> as a {@link CellEditorListener} from + * previous {@link #cellEditor} and register it with new parameter + * <code>c</code>.</p> + * + * @param c The new value of the cellEditor property + */ + public void setCellEditor(TableCellEditor c) + { + TableCellEditor tmp = cellEditor; + if (tmp != null) + tmp.removeCellEditorListener(this); + if (c != null) + c.addCellEditorListener(this); + cellEditor = c; + } + + /** + * Set the value of the {@link #dragEnabled} property. + * + * @param d The new value of the dragEnabled property + */ + public void setDragEnabled(boolean d) + { + dragEnabled = d; + } + + /** + * Set the value of the {@link #gridColor} property. + * + * @param g The new value of the gridColor property + */ + public void setGridColor(Color g) + { + gridColor = g; + repaint(); + } + + /** + * Set the value of the {@link #interCellSpacing} property. + * + * @param i The new value of the interCellSpacing property + */ + public void setInterCellSpacing(Dimension i) + { + rowMargin = i.height; + columnModel.setColumnMargin(i.width); + repaint(); + } + + /** + * Set the value of the {@link #preferredScrollableViewportSize} property. + * + * @param p The new value of the preferredScrollableViewportSize property + */ + public void setPreferredScrollableViewportSize(Dimension p) + { + preferredScrollableViewportSize = p; + revalidate(); + repaint(); + } + + /** + * <p>Set the value of the {@link #selectionBackground} property.</p> + * + * <p>Fire a PropertyChangeEvent with name {@link + * #SELECTION_BACKGROUND_CHANGED_PROPERTY} to registered listeners, if + * selectionBackground changed.</p> + * + * @param s The new value of the selectionBackground property + */ + public void setSelectionBackground(Color s) + { + Color tmp = selectionBackground; + selectionBackground = s; + if (((tmp == null && s != null) + || (s == null && tmp != null) + || (tmp != null && s != null && !tmp.equals(s)))) + firePropertyChange(SELECTION_BACKGROUND_CHANGED_PROPERTY, tmp, s); + repaint(); + } + + /** + * <p>Set the value of the {@link #selectionForeground} property.</p> + * + * <p>Fire a PropertyChangeEvent with name {@link + * SELECTION_FOREGROUND_CHANGED_PROPERTY} to registered listeners, if + * selectionForeground changed.</p> + * + * @param s The new value of the selectionForeground property + */ + public void setSelectionForeground(Color s) + { + Color tmp = selectionForeground; + selectionForeground = s; + if (((tmp == null && s != null) + || (s == null && tmp != null) + || (tmp != null && s != null && !tmp.equals(s)))) + firePropertyChange(SELECTION_FOREGROUND_CHANGED_PROPERTY, tmp, s); + repaint(); + } + + /** + * Set the value of the {@link #showGrid} property. + * + * @param s The new value of the showGrid property + */ + public void setShowGrid(boolean s) + { + setShowVerticalLines(s); + setShowHorizontalLines(s); + } + + /** + * Set the value of the {@link #showHorizontalLines} property. + * + * @param s The new value of the showHorizontalLines property + */ + public void setShowHorizontalLines(boolean s) + { + showHorizontalLines = s; + repaint(); + } + + /** + * Set the value of the {@link #showVerticalLines} property. + * + * @param s The new value of the showVerticalLines property + */ + public void setShowVerticalLines(boolean s) { - // FIXME: - return null; + showVerticalLines = s; + repaint(); } + + /** + * Set the value of the {@link #tableHeader} property. + * + * @param t The new value of the tableHeader property + */ + public void setTableHeader(JTableHeader t) + { + if (tableHeader != null) + tableHeader.setTable(null); + tableHeader = t; + if (tableHeader != null) + tableHeader.setTable(this); + revalidate(); + repaint(); + } + + protected void configureEnclosingScrollPane() + { + JScrollPane jsp = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, this); + if (jsp != null && tableHeader != null) + { + jsp.setColumnHeaderView(tableHeader); + } + } + + protected void unconfigureEnclosingScrollPane() + { + JScrollPane jsp = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, this); + if (jsp != null) + { + jsp.setColumnHeaderView(null); + } + } + + + public void addNotify() + { + super.addNotify(); + configureEnclosingScrollPane(); + } + + public void removeNotify() + { + super.addNotify(); + unconfigureEnclosingScrollPane(); + } + + + /** + * Sun javadocs describe an unusual implementation of + * <code>doLayout</code> which involves some private interfaces. We try + * to implement the same algorithm as is documented, but using the + * columnModel directly. We still use a private helper method, but it has + * a simpler signature. + */ + + private void distributeSpill(TableColumn[] cols, int spill) + { + int MIN = 0; + int MAX = 0; + int PREF = 0; + + int[] min = new int[cols.length]; + int[] max = new int[cols.length]; + int[] pref = new int[cols.length]; + + for (int i = 0; i < cols.length; ++i) + { + pref[i] = cols[i].getPreferredWidth(); + min[i] = cols[i].getMinWidth(); + max[i] = cols[i].getMaxWidth(); + PREF += pref[i]; + MIN += min[i]; + MAX += max[i]; + } + + for (int i = 0; i < cols.length; ++i) + { + int adj = 0; + if (spill > 0) + adj = (spill * (pref[i] - min[i])) / (PREF - MIN); + else + adj = (spill * (max[i] - pref[i])) / (MAX - PREF); + cols[i].setWidth(pref[i] + adj); + } + } + + public void doLayout() + { + TableColumn resizingColumn = null; + + int ncols = getColumnCount(); + if (ncols < 1) + return; + + int[] pref = new int[ncols]; + int prefSum = 0; + int rCol = -1; + + if (tableHeader != null) + resizingColumn = tableHeader.getResizingColumn(); + + for (int i = 0; i < ncols; ++i) + { + TableColumn col = columnModel.getColumn(i); + int p = col.getWidth(); + pref[i] = p; + prefSum += p; + if (resizingColumn == col) + rCol = i; + } + + int spill = prefSum - getWidth(); + + if (resizingColumn != null) + { + TableColumn col; + TableColumn [] cols; + + switch (getAutoResizeMode()) + { + case AUTO_RESIZE_LAST_COLUMN: + col = columnModel.getColumn(ncols-1); + col.setWidth(col.getPreferredWidth() + spill); + break; + + case AUTO_RESIZE_NEXT_COLUMN: + col = columnModel.getColumn(ncols-1); + col.setWidth(col.getPreferredWidth() + spill); + break; + + case AUTO_RESIZE_ALL_COLUMNS: + cols = new TableColumn[ncols]; + for (int i = 0; i < ncols; ++i) + cols[i] = columnModel.getColumn(i); + distributeSpill(cols, spill); + break; + + case AUTO_RESIZE_SUBSEQUENT_COLUMNS: + cols = new TableColumn[ncols]; + for (int i = rCol; i < ncols; ++i) + cols[i] = columnModel.getColumn(i); + distributeSpill(cols, spill); + break; + + case AUTO_RESIZE_OFF: + default: + } + } + else + { + TableColumn [] cols = new TableColumn[ncols]; + for (int i = 0; i < ncols; ++i) + cols[i] = columnModel.getColumn(i); + distributeSpill(cols, spill); + } + } + + public void sizeColumnsToFit(boolean lastColumnOnly) + { + doLayout(); + } + + public void sizeColumnsToFit(int resizingColumn) + { + doLayout(); + } + + + public String getUIClassID() + { + return "TableUI"; + } + + public TableUI getUI() + { + return (TableUI) ui; + } + + public void updateUI() + { + setUI((TableUI) UIManager.getUI(this)); + revalidate(); + repaint(); + } + } |