Commit 57579172 by Graydon Hoare

[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
parent 1e8964cf
......@@ -268,6 +268,7 @@ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c \
jni/gtk-peer/gthread-jni.c \
jni/classpath/jcl.c \
jni/classpath/jnilink.c \
......@@ -284,8 +285,6 @@ gnu/java/awt/peer/gtk/GdkGraphics.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/GtkArg.java \
gnu/java/awt/peer/gtk/GtkArgList.java \
gnu/java/awt/peer/gtk/GtkButtonPeer.java \
gnu/java/awt/peer/gtk/GtkCanvasPeer.java \
gnu/java/awt/peer/gtk/GtkCheckboxGroupPeer.java \
......@@ -319,7 +318,10 @@ gnu/java/awt/peer/gtk/GtkTextAreaPeer.java \
gnu/java/awt/peer/gtk/GtkTextComponentPeer.java \
gnu/java/awt/peer/gtk/GtkTextFieldPeer.java \
gnu/java/awt/peer/gtk/GtkToolkit.java \
gnu/java/awt/peer/gtk/GtkWindowPeer.java
gnu/java/awt/peer/gtk/GtkWindowPeer.java \
gnu/java/awt/peer/gtk/GThreadMutex.java \
gnu/java/awt/peer/gtk/GThreadNativeMethodRunner.java
gtk_jni_headers = $(patsubst %.java,jniinclude/%.h,$(subst /,_,$(gtk_awt_peer_sources)))
......@@ -344,7 +346,8 @@ jni/classpath/primlib.h
lib_gnu_java_awt_peer_gtk_la_CFLAGS = \
-Ijniinclude -I$(srcdir)/jni/classpath \
-I$(srcdir)/jni/gtk-peer $(GTK_CFLAGS) $(LIBART_CFLAGS)
-I$(srcdir)/jni/gtk-peer $(PEDANTIC_CFLAGS) $(GTK_CFLAGS) $(LIBART_CFLAGS) \
$(CAIRO_CFLAGS) $(PANGOFT2_CFLAGS)
lib_gnu_java_awt_peer_gtk_la_GCJFLAGS = $(AM_GCJFLAGS) -fjni
lib_gnu_java_awt_peer_gtk_la_LIBADD = $(GTK_LIBS) $(GLIB_LIBS) $(LIBART_LIBS) $(CAIRO_LIBS) $(PANGOFT2_LIBS)
lib_gnu_java_awt_peer_gtk_la_DEPENDENCIES = $(gtk_jni_headers) libgcj-@gcc_version@.jar libgcj.la libgcj.spec
......@@ -1327,12 +1330,19 @@ javax/swing/border/TitledBorder.java \
javax/swing/GrayFilter.java \
javax/swing/AbstractAction.java \
javax/swing/AbstractButton.java \
javax/swing/AbstractSpinnerModel.java \
javax/swing/plaf/basic/BasicArrowButton.java \
javax/swing/plaf/basic/BasicButtonListener.java \
javax/swing/plaf/basic/BasicButtonUI.java \
javax/swing/plaf/basic/BasicCheckBoxUI.java \
javax/swing/plaf/basic/BasicColorChooserUI.java \
javax/swing/plaf/basic/BasicComboBoxUI.java \
javax/swing/plaf/basic/BasicComboBoxEditor.java \
javax/swing/plaf/basic/BasicComboBoxRenderer.java \
javax/swing/plaf/basic/BasicComboPopup.java \
javax/swing/plaf/basic/BasicDesktopIconUI.java \
javax/swing/plaf/basic/BasicDesktopPaneUI.java \
javax/swing/plaf/basic/BasicFormattedTextFieldUI.java \
javax/swing/plaf/basic/BasicGraphicsUtils.java \
javax/swing/plaf/basic/BasicInternalFrameTitlePane.java \
javax/swing/plaf/basic/BasicInternalFrameUI.java \
......@@ -1343,6 +1353,7 @@ javax/swing/plaf/basic/BasicMenuBarUI.java \
javax/swing/plaf/basic/BasicMenuItemUI.java \
javax/swing/plaf/basic/BasicOptionPaneUI.java \
javax/swing/plaf/basic/BasicPanelUI.java \
javax/swing/plaf/basic/BasicPasswordFieldUI.java \
javax/swing/plaf/basic/BasicPopupMenuUI.java \
javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java \
javax/swing/plaf/basic/BasicProgressBarUI.java \
......@@ -1354,19 +1365,25 @@ javax/swing/plaf/basic/BasicScrollBarUI.java \
javax/swing/plaf/basic/BasicScrollPaneUI.java \
javax/swing/plaf/basic/BasicSeparatorUI.java \
javax/swing/plaf/basic/BasicSliderUI.java \
javax/swing/plaf/basic/BasicSpinnerUI.java \
javax/swing/plaf/basic/BasicSplitPaneDivider.java \
javax/swing/plaf/basic/BasicSplitPaneUI.java \
javax/swing/plaf/basic/BasicTabbedPaneUI.java \
javax/swing/plaf/basic/BasicTableUI.java \
javax/swing/plaf/basic/BasicTableHeaderUI.java \
javax/swing/plaf/basic/BasicTextAreaUI.java \
javax/swing/plaf/basic/BasicTextFieldUI.java \
javax/swing/plaf/basic/BasicTextUI.java \
javax/swing/plaf/basic/BasicToggleButtonUI.java \
javax/swing/plaf/basic/BasicToolBarSeparatorUI.java \
javax/swing/plaf/basic/BasicToolBarUI.java \
javax/swing/plaf/basic/BasicToolTipUI.java \
javax/swing/plaf/basic/BasicTreeUI.java \
javax/swing/plaf/basic/BasicViewportUI.java \
javax/swing/plaf/basic/BasicLookAndFeel.java \
javax/swing/plaf/basic/BasicBorders.java \
javax/swing/plaf/basic/BasicIconFactory.java \
javax/swing/plaf/basic/ComboPopup.java \
javax/swing/plaf/BorderUIResource.java \
javax/swing/plaf/UIResource.java \
javax/swing/plaf/ButtonUI.java \
......@@ -1415,6 +1432,10 @@ javax/swing/colorchooser/AbstractColorChooserPanel.java \
javax/swing/colorchooser/ColorChooserComponentFactory.java \
javax/swing/colorchooser/ColorSelectionModel.java \
javax/swing/colorchooser/DefaultColorSelectionModel.java \
javax/swing/colorchooser/DefaultPreviewPanel.java \
javax/swing/colorchooser/DefaultSwatchChooserPanel.java \
javax/swing/colorchooser/DefaultHSBChooserPanel.java \
javax/swing/colorchooser/DefaultRGBChooserPanel.java \
javax/swing/filechooser/FileFilter.java \
javax/swing/filechooser/FileSystemView.java \
javax/swing/filechooser/FileView.java \
......@@ -1460,6 +1481,7 @@ javax/swing/JRadioButton.java \
javax/swing/JRootPane.java \
javax/swing/JScrollBar.java \
javax/swing/JScrollPane.java \
javax/swing/JSpinner.java \
javax/swing/JTabbedPane.java \
javax/swing/JTextArea.java \
javax/swing/JTextField.java \
......@@ -1474,11 +1496,15 @@ javax/swing/ListModel.java \
javax/swing/ListSelectionModel.java \
javax/swing/LookAndFeel.java \
javax/swing/Scrollable.java \
javax/swing/SpinnerModel.java \
javax/swing/SpinnerNumberModel.java \
javax/swing/Spring.java \
javax/swing/SpringLayout.java \
javax/swing/SwingConstants.java \
javax/swing/SwingUtilities.java \
javax/swing/Timer.java \
javax/swing/ToolTipManager.java \
javax/swing/TransferHandler.java \
javax/swing/UIDefaults.java \
javax/swing/UIManager.java \
javax/swing/UnsupportedLookAndFeelException.java \
......@@ -1550,12 +1576,18 @@ javax/swing/text/PlainDocument.java \
javax/swing/text/PlainView.java \
javax/swing/text/Position.java \
javax/swing/text/Segment.java \
javax/swing/text/SimpleAttributeSet.java \
javax/swing/text/Style.java \
javax/swing/text/StyleConstants.java \
javax/swing/text/StyleContext.java \
javax/swing/text/StyledDocument.java \
javax/swing/text/StyledEditorKit.java \
javax/swing/text/TabExpander.java \
javax/swing/text/TabableView.java \
javax/swing/text/TabExpander.java \
javax/swing/text/TabSet.java \
javax/swing/text/TabStop.java \
javax/swing/text/TextAction.java \
javax/swing/text/Utilities.java \
javax/swing/text/View.java \
javax/swing/text/ViewFactory.java \
javax/swing/text/html/HTML.java \
......@@ -1638,7 +1670,6 @@ javax/swing/ProgressMonitor.java \
javax/swing/ProgressMonitorInputStream.java \
javax/swing/RepaintManager.java \
javax/swing/ScrollPaneLayout.java \
javax/swing/ToolTipManager.java \
javax/swing/ViewportLayout.java
rmi_java_source_files = \
......
......@@ -141,7 +141,7 @@ public class LightweightRedirector
MouseEvent redirected = new MouseEvent(source, event.getID(),
event.getWhen(),
event.getModifiers(),
event.getModifiersEx(),
x, y,
event.getClickCount(),
event.isPopupTrigger());
......@@ -157,20 +157,20 @@ public class LightweightRedirector
*/
int getButtonNumber(InputEvent event)
{
int modifiers = event.getModifiers();
int modifiers = event.getModifiersEx();
modifiers &=
InputEvent.BUTTON1_MASK |
InputEvent.BUTTON2_MASK |
InputEvent.BUTTON3_MASK;
InputEvent.BUTTON1_DOWN_MASK |
InputEvent.BUTTON2_DOWN_MASK |
InputEvent.BUTTON3_DOWN_MASK;
switch (modifiers)
{
case InputEvent.BUTTON1_MASK:
case InputEvent.BUTTON1_DOWN_MASK:
return 1;
case InputEvent.BUTTON2_MASK:
case InputEvent.BUTTON2_DOWN_MASK:
return 2;
case InputEvent.BUTTON3_MASK:
case InputEvent.BUTTON3_DOWN_MASK:
return 3;
case 0:
return 0;
......
......@@ -197,13 +197,13 @@ public class XEventLoop implements Runnable
switch (buttonEvt.button)
{
case 1:
modifiers = InputEvent.BUTTON1_MASK;
modifiers = InputEvent.BUTTON1_DOWN_MASK;
break;
case 2:
modifiers = InputEvent.BUTTON2_MASK;
modifiers = InputEvent.BUTTON2_DOWN_MASK;
break;
case 3:
modifiers = InputEvent.BUTTON2_MASK;
modifiers = InputEvent.BUTTON2_DOWN_MASK;
break;
}
......
/* GLightweightPeer.java --
Copyright (C) 2003 Free Software Foundation, Inc.
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
......@@ -45,7 +45,6 @@ import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
......
......@@ -64,7 +64,7 @@ public class GdkGraphics extends Graphics
static final int GDK_COPY = 0, GDK_XOR = 2;
native int[] initState (GtkComponentPeer component);
native void initState (GtkComponentPeer component);
native void initState (int width, int height);
native void copyState (GdkGraphics g);
......@@ -84,15 +84,15 @@ public class GdkGraphics extends Graphics
initState (width, height);
color = Color.black;
clip = new Rectangle (0, 0, width, height);
font = new Font ("Dialog", Font.PLAIN, 10);
font = new Font ("Dialog", Font.PLAIN, 12);
}
GdkGraphics (GtkComponentPeer component)
{
this.component = component;
int rgb[] = initState (component);
color = new Color (rgb[0], rgb[1], rgb[2]);
font = component.awtComponent.getFont();
initState (component);
color = component.awtComponent.getForeground ();
font = component.awtComponent.getFont ();
Dimension d = component.awtComponent.getSize ();
clip = new Rectangle (0, 0, d.width, d.height);
}
......@@ -126,6 +126,11 @@ public class GdkGraphics extends Graphics
native public void dispose ();
native void copyPixmap (Graphics g, int x, int y, int width, int height);
native void copyAndScalePixmap (Graphics g, boolean flip_x, boolean flip_y,
int src_x, int src_y,
int src_width, int src_height,
int dest_x, int dest_y,
int dest_width, int dest_height);
public boolean drawImage (Image img, int x, int y,
Color bgcolor, ImageObserver observer)
{
......@@ -161,7 +166,10 @@ public class GdkGraphics extends Graphics
{
if (img instanceof GtkOffScreenImage)
{
throw new RuntimeException ();
copyAndScalePixmap (img.getGraphics (), false, false,
0, 0, img.getWidth (null), img.getHeight (null),
x, y, width, height);
return true;
}
GtkImage image = (GtkImage) img;
......@@ -186,7 +194,60 @@ public class GdkGraphics extends Graphics
{
if (img instanceof GtkOffScreenImage)
{
throw new RuntimeException ();
int dx_start, dy_start, d_width, d_height;
int sx_start, sy_start, s_width, s_height;
boolean x_flip = false;
boolean y_flip = false;
if (dx1 < dx2)
{
dx_start = dx1;
d_width = dx2 - dx1;
}
else
{
dx_start = dx2;
d_width = dx1 - dx2;
x_flip ^= true;
}
if (dy1 < dy2)
{
dy_start = dy1;
d_height = dy2 - dy1;
}
else
{
dy_start = dy2;
d_height = dy1 - dy2;
y_flip ^= true;
}
if (sx1 < sx2)
{
sx_start = sx1;
s_width = sx2 - sx1;
}
else
{
sx_start = sx2;
s_width = sx1 - sx2;
x_flip ^= true;
}
if (sy1 < sy2)
{
sy_start = sy1;
s_height = sy2 - sy1;
}
else
{
sy_start = sy2;
s_height = sy1 - sy2;
y_flip ^= true;
}
copyAndScalePixmap (img.getGraphics (), x_flip, y_flip,
sx_start, sy_start, s_width, s_height,
dx_start, dy_start, d_width, d_height);
return true;
}
GtkImage image = (GtkImage) img;
......@@ -238,13 +299,48 @@ public class GdkGraphics extends Graphics
public void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight)
{
// System.out.println ("drawRoundRect called [UNIMPLEMENTED]");
if (arcWidth > width)
arcWidth = width;
if (arcHeight > height)
arcHeight = height;
int xx = x + width - arcWidth;
int yy = y + height - arcHeight;
drawArc (x, y, arcWidth, arcHeight, 90, 90);
drawArc (xx, y, arcWidth, arcHeight, 0, 90);
drawArc (xx, yy, arcWidth, arcHeight, 270, 90);
drawArc (x, yy, arcWidth, arcHeight, 180, 90);
int y1 = y + arcHeight / 2;
int y2 = y + height - arcHeight / 2;
drawLine (x, y1, x, y2);
drawLine (x + width, y1, x + width, y2);
int x1 = x + arcWidth / 2;
int x2 = x + width - arcWidth / 2;
drawLine (x1, y, x2, y);
drawLine (x1, y + height, x2, y + height);
}
public void fillRoundRect (int x, int y, int width, int height,
int arcWidth, int arcHeight)
{
// System.out.println ("fillRoundRect called [UNIMPLEMENTED]");
if (arcWidth > width)
arcWidth = width;
if (arcHeight > height)
arcHeight = height;
int xx = x + width - arcWidth;
int yy = y + height - arcHeight;
fillArc (x, y, arcWidth, arcHeight, 90, 90);
fillArc (xx, y, arcWidth, arcHeight, 0, 90);
fillArc (xx, yy, arcWidth, arcHeight, 270, 90);
fillArc (x, yy, arcWidth, arcHeight, 180, 90);
fillRect (x, y + arcHeight / 2, width, height - arcHeight + 1);
fillRect (x + arcWidth / 2, y, width - arcWidth + 1, height);
}
public Shape getClip ()
......
/* GdkGraphics2D.java
Copyright (C) 2003 Free Software Foundation, Inc.
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
......@@ -48,7 +48,6 @@ import java.util.HashMap;
import java.util.Map;
import java.text.AttributedCharacterIterator;
import java.util.Map;
import java.util.Stack;
import java.lang.Integer;
import gnu.java.awt.ClasspathToolkit;
......@@ -88,7 +87,7 @@ public class GdkGraphics2D extends Graphics2D
private Stack stateStack;
native private int[] initState (GtkComponentPeer component);
native private void initState (GtkComponentPeer component);
native private void initState (int width, int height);
native private void copyState (GdkGraphics2D g);
native public void dispose ();
......@@ -169,10 +168,10 @@ public class GdkGraphics2D extends Graphics2D
GdkGraphics2D (GtkComponentPeer component)
{
this.component = component;
int rgb[] = initState (component);
initState (component);
setColor (new Color (rgb[0], rgb[1], rgb[2]));
setBackground (new Color (rgb[3], rgb[4], rgb[5]));
setColor (component.awtComponent.getForeground ());
setBackground (component.awtComponent.getBackground ());
setPaint (getColor());
setFont (new Font("SansSerif", Font.PLAIN, 12));
setTransform (new AffineTransform ());
......@@ -1478,14 +1477,28 @@ public class GdkGraphics2D extends Graphics2D
public void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight)
{
int x1 = x + arcWidth, x2 = x + width - arcWidth;
int y1 = y + arcHeight, y2 = y + height - arcHeight;
fillRect (x1, y, x2 - x1, height);
fillRect (x, y1, width, y2 - y1);
fillArc (x, y, arcWidth, arcHeight, 90, 90);
fillArc (x1, y, arcWidth, arcHeight, 0, 90);
fillArc (x2, y2, arcWidth, arcHeight, 270, 90);
fillArc (x, y2, arcWidth, arcHeight, 180, 90);
if (arcWidth > width)
arcWidth = width;
if (arcHeight > height)
arcHeight = height;
int xx = x + width - arcWidth;
int yy = y + height - arcHeight;
drawArc (x, y, arcWidth, arcHeight, 90, 90);
drawArc (xx, y, arcWidth, arcHeight, 0, 90);
drawArc (xx, yy, arcWidth, arcHeight, 270, 90);
drawArc (x, yy, arcWidth, arcHeight, 180, 90);
int y1 = y + arcHeight / 2;
int y2 = y + height - arcHeight / 2;
drawLine (x, y1, x, y2);
drawLine (x + width, y1, x + width, y2);
int x1 = x + arcWidth / 2;
int x2 = x + width - arcWidth / 2;
drawLine (x1, y, x2, y);
drawLine (x1, y + height, x2, y + height);
}
public void drawString (String str, int x, int y)
......@@ -1527,14 +1540,21 @@ public class GdkGraphics2D extends Graphics2D
public void fillRoundRect (int x, int y, int width, int height,
int arcWidth, int arcHeight)
{
int x1 = x + arcWidth, x2 = x + width - arcWidth;
int y1 = y + arcHeight, y2 = y + height - arcHeight;
fillRect (x1, y, x2 - x1, height);
fillRect (x, y1, width, y2 - y1);
if (arcWidth > width)
arcWidth = width;
if (arcHeight > height)
arcHeight = height;
int xx = x + width - arcWidth;
int yy = y + height - arcHeight;
fillArc (x, y, arcWidth, arcHeight, 90, 90);
fillArc (x1, y, arcWidth, arcHeight, 0, 90);
fillArc (x2, y2, arcWidth, arcHeight, 270, 90);
fillArc (x, y2, arcWidth, arcHeight, 180, 90);
fillArc (xx, y, arcWidth, arcHeight, 0, 90);
fillArc (xx, yy, arcWidth, arcHeight, 270, 90);
fillArc (x, yy, arcWidth, arcHeight, 180, 90);
fillRect (x, y + arcHeight / 2, width, height - arcHeight + 1);
fillRect (x + arcWidth / 2, y, width - arcWidth + 1, height);
}
public Font getFont ()
......
......@@ -50,12 +50,13 @@ import java.awt.peer.ButtonPeer;
public class GtkButtonPeer extends GtkComponentPeer
implements ButtonPeer
{
native void create ();
native void create (String label);
public native void connectJObject ();
public native void connectSignals ();
native void gtkSetFont (String name, int style, int size);
native void gtkSetLabel(String label);
native void gtkSetLabel (String label);
native void gtkWidgetSetForeground (int red, int green, int blue);
native void gtkActivate ();
......@@ -64,6 +65,11 @@ public class GtkButtonPeer extends GtkComponentPeer
super (b);
}
void create ()
{
create (((Button) awtComponent).getLabel ());
}
public void setLabel (String label)
{
gtkSetLabel(label);
......@@ -78,10 +84,10 @@ public class GtkButtonPeer extends GtkComponentPeer
p.translate(((Component) me.getSource()).getX(),
((Component) me.getSource()).getY());
if (!me.isConsumed ()
&& (me.getModifiers () & MouseEvent.BUTTON1_MASK) != 0
&& (me.getModifiersEx () & MouseEvent.BUTTON1_DOWN_MASK) != 0
&& awtComponent.getBounds().contains(p))
postActionEvent (((Button)awtComponent).getActionCommand (),
me.getModifiers ());
me.getModifiersEx ());
}
if (e.getID () == KeyEvent.KEY_PRESSED)
......@@ -90,18 +96,11 @@ public class GtkButtonPeer extends GtkComponentPeer
if (!ke.isConsumed () && ke.getKeyCode () == KeyEvent.VK_SPACE)
{
postActionEvent (((Button) awtComponent).getActionCommand (),
ke.getModifiers ());
ke.getModifiersEx ());
gtkActivate ();
}
}
super.handleEvent (e);
}
public void getArgs (Component component, GtkArgList args)
{
super.getArgs (component, args);
args.add ("label", ((Button)component).getLabel ());
}
}
......@@ -52,39 +52,39 @@ public class GtkCheckboxPeer extends GtkComponentPeer
// The current state of the GTK checkbox.
private boolean currentState;
public native void nativeCreate (GtkCheckboxGroupPeer group,
boolean state);
public native void create (GtkCheckboxGroupPeer group);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
public native void connectSignals ();
native void gtkSetFont (String name, int style, int size);
public native void gtkSetLabel (String label);
native void gtkButtonSetLabel (String label);
native void gtkToggleButtonSetActive (boolean is_active);
public GtkCheckboxPeer (Checkbox c)
{
super (c);
}
// We can't fully use the ordinary getArgs code here, due to
// oddities of this particular widget. In particular we must be
// able to switch between a checkbutton and a radiobutton
// dynamically.
// FIXME: we must be able to switch between a checkbutton and a
// radiobutton dynamically.
public void create ()
{
CheckboxGroup g = ((Checkbox) awtComponent).getCheckboxGroup ();
Checkbox checkbox = (Checkbox) awtComponent;
CheckboxGroup g = checkbox.getCheckboxGroup ();
old_group = GtkCheckboxGroupPeer.getCheckboxGroupPeer (g);
currentState = ((Checkbox)awtComponent).getState();
nativeCreate (old_group, currentState);
create (old_group);
gtkToggleButtonSetActive (checkbox.getState ());
gtkButtonSetLabel (checkbox.getLabel ());
}
public void setState (boolean state)
{
if (currentState != state)
set ("active", state);
gtkToggleButtonSetActive (state);
}
public void setLabel (String label)
{
gtkSetLabel (label);
gtkButtonSetLabel (label);
}
public void setCheckboxGroup (CheckboxGroup group)
......@@ -100,13 +100,6 @@ public class GtkCheckboxPeer extends GtkComponentPeer
}
}
public void getArgs (Component component, GtkArgList args)
{
super.getArgs (component, args);
args.add ("active", ((Checkbox) component).getState ());
args.add ("label", ((Checkbox) component).getLabel ());
}
// Override the superclass postItemEvent so that the peer doesn't
// need information that we have.
public void postItemEvent (Object item, int stateChange)
......
......@@ -58,25 +58,22 @@ public class GtkChoicePeer extends GtkComponentPeer
items[i] = c.getItem (i);
append (items);
// Must set our state before notifying listeners
((Choice) awtComponent).select (c.getItem (0));
postItemEvent (c.getItem (0), ItemEvent.SELECTED);
}
}
native void create ();
native void append (String items[]);
native int getHistory ();
native int nativeGetSelected ();
native void nativeAdd (String item, int index);
native void nativeRemove (int index);
native void nativeRemoveAll ();
native public void select (int position);
public void add (String item, int index)
{
int before = getHistory();
int before = nativeGetSelected();
nativeAdd (item, index);
......@@ -92,11 +89,11 @@ public class GtkChoicePeer extends GtkComponentPeer
public void remove (int index)
{
int before = getHistory();
int before = nativeGetSelected();
int after;
nativeRemove (index);
after = getHistory();
after = nativeGetSelected();
/* Generate an ItemEvent if we are removing the currently selected item
and there are at least one item left. */
......@@ -110,7 +107,7 @@ public class GtkChoicePeer extends GtkComponentPeer
public void removeAll ()
{
nativeRemove (-1);
nativeRemoveAll();
}
public void addItem (String item, int position)
......
......@@ -61,7 +61,6 @@ import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
......@@ -93,6 +92,8 @@ public class GtkComponentPeer extends GtkGenericPeer
native void gtkWidgetSetCursor (int type);
native void gtkWidgetSetBackground (int red, int green, int blue);
native void gtkWidgetSetForeground (int red, int green, int blue);
native void gtkWidgetSetSensitive (boolean sensitive);
native void gtkWidgetSetParent (ComponentPeer parent);
native void gtkWidgetRequestFocus ();
native void gtkWidgetDispatchKeyEvent (int id, long when, int mods,
int keyCode, int keyLocation);
......@@ -115,37 +116,59 @@ public class GtkComponentPeer extends GtkGenericPeer
this.awtComponent = awtComponent;
insets = new Insets (0, 0, 0, 0);
create ();
GtkArgList args = new GtkArgList ();
getArgs (awtComponent, args);
args.setArgs (this);
connectJObject ();
connectSignals ();
if (awtComponent.getForeground () != null)
setForeground (awtComponent.getForeground ());
if (awtComponent.getBackground () != null)
setBackground (awtComponent.getBackground ());
if (awtComponent.getFont() != null)
setFont(awtComponent.getFont());
setCursor (awtComponent.getCursor ());
if (this instanceof GtkFileDialogPeer && awtComponent.getHeight() == 0
&& awtComponent.getWidth() == 0)
create ();
setParent ();
connectJObject ();
connectSignals ();
if (awtComponent.getForeground () != null)
setForeground (awtComponent.getForeground ());
if (awtComponent.getBackground () != null)
setBackground (awtComponent.getBackground ());
if (awtComponent.getFont() != null)
setFont(awtComponent.getFont());
setCursor (awtComponent.getCursor ());
setComponentBounds ();
Rectangle bounds = awtComponent.getBounds ();
setBounds (bounds.x, bounds.y, bounds.width, bounds.height);
setVisibleAndEnabled ();
}
void setParent ()
{
ComponentPeer p;
Component component = awtComponent;
do
{
int[] dims = new int[2];
gtkWidgetGetDimensions(dims);
((GtkFileDialogPeer) this).setBoundsCallback((Window)awtComponent,
awtComponent.getX(),
awtComponent.getY(),
dims[0], dims[1]);
component = component.getParent ();
p = component.getPeer ();
}
while (p instanceof java.awt.peer.LightweightPeer);
if (p != null)
gtkWidgetSetParent (p);
}
/*
* Set the bounds of this peer's AWT Component based on dimensions
* returned by the native windowing system. Most Components impose
* their dimensions on the peers so the default implementation does
* nothing. However some peers, like GtkFileDialogPeer, need to
* pass their size back to the AWT Component.
*/
void setComponentBounds ()
{
}
Rectangle bounds = awtComponent.getBounds ();
setBounds (bounds.x, bounds.y, bounds.width, bounds.height);
void setVisibleAndEnabled ()
{
setVisible (awtComponent.isVisible ());
setEnabled (awtComponent.isEnabled ());
}
public int checkImage (Image image, int width, int height,
......@@ -260,12 +283,12 @@ public class GtkComponentPeer extends GtkGenericPeer
break;
case KeyEvent.KEY_PRESSED:
ke = (KeyEvent) event;
gtkWidgetDispatchKeyEvent (ke.getID (), ke.getWhen (), ke.getModifiers (),
gtkWidgetDispatchKeyEvent (ke.getID (), ke.getWhen (), ke.getModifiersEx (),
ke.getKeyCode (), ke.getKeyLocation ());
break;
case KeyEvent.KEY_RELEASED:
ke = (KeyEvent) event;
gtkWidgetDispatchKeyEvent (ke.getID (), ke.getWhen (), ke.getModifiers (),
gtkWidgetDispatchKeyEvent (ke.getID (), ke.getWhen (), ke.getModifiersEx (),
ke.getKeyCode (), ke.getKeyLocation ());
break;
}
......@@ -417,7 +440,7 @@ public class GtkComponentPeer extends GtkGenericPeer
public void setEnabled (boolean b)
{
set ("sensitive", b);
gtkWidgetSetSensitive (b);
}
public void setFont (Font f)
......@@ -506,45 +529,6 @@ public class GtkComponentPeer extends GtkGenericPeer
item, stateChange));
}
public void getArgs (Component component, GtkArgList args)
{
args.add ("sensitive", component.isEnabled ());
ComponentPeer p;
do
{
component = component.getParent ();
p = component.getPeer ();
} while (p instanceof java.awt.peer.LightweightPeer);
if (p != null)
args.add ("parent", p);
}
native void set (String name, String value);
native void set (String name, boolean value);
native void set (String name, int value);
native void set (String name, float value);
native void set (String name, Object value);
void set (GtkArg arg)
{
String name = arg.getName ();
Object value = arg.getValue ();
if (value instanceof Boolean)
set (name, ((Boolean)value).booleanValue ());
else if (value instanceof Integer)
set (name, ((Integer)value).intValue ());
else if (value instanceof Float)
set (name, ((Float)value).floatValue ());
else if (value instanceof String)
set (name, ((String) value));
else
set (name, value);
}
public GraphicsConfiguration getGraphicsConfiguration ()
{
// FIXME: just a stub for now.
......
......@@ -85,17 +85,11 @@ public class GtkDialogPeer extends GtkWindowPeer
{
// Create a decorated dialog window.
create (GDK_WINDOW_TYPE_HINT_DIALOG, true);
}
public void getArgs (Component component, GtkArgList args)
{
super.getArgs (component, args);
Dialog dialog = (Dialog) component;
Dialog dialog = (Dialog) awtComponent;
args.add ("title", dialog.getTitle ());
args.add ("modal", dialog.isModal ());
args.add ("allow_shrink", dialog.isResizable ());
args.add ("allow_grow", dialog.isResizable ());
gtkWindowSetModal (dialog.isModal ());
setTitle (dialog.getTitle ());
setResizable (dialog.isResizable ());
}
}
......@@ -42,6 +42,7 @@ import java.awt.AWTEvent;
import java.awt.Dialog;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.event.WindowEvent;
import java.awt.peer.FileDialogPeer;
import java.io.FilenameFilter;
......@@ -81,6 +82,20 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer
super (fd);
}
void setComponentBounds ()
{
if (awtComponent.getHeight () == 0
&& awtComponent.getWidth () == 0)
{
int[] dims = new int[2];
gtkWidgetGetPreferredDimensions (dims);
((GtkFileDialogPeer) this).setBoundsCallback ((Window) awtComponent,
awtComponent.getX (),
awtComponent.getY (),
dims[0], dims[1]);
}
}
public void setFile (String fileName)
{
/* If nothing changed do nothing. This usually happens because
......
......@@ -47,6 +47,7 @@ import java.awt.MenuBar;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.PaintEvent;
import java.awt.image.ColorModel;
import java.awt.peer.FramePeer;
import java.awt.peer.MenuBarPeer;
......@@ -115,10 +116,9 @@ public class GtkFramePeer extends GtkWindowPeer
setSize (awtComponent.getWidth() - insets.left - insets.right,
awtComponent.getHeight() - insets.top - insets.bottom
+ menuBarHeight);
set ("allow_shrink", resizable);
set ("allow_grow", resizable);
}
gtkWindowSetResizable (resizable);
}
protected void postInsetsChangedEvent (int top, int left,
int bottom, int right)
{
......@@ -137,24 +137,46 @@ public class GtkFramePeer extends GtkWindowPeer
{
// Create a normal decorated window.
create (GDK_WINDOW_TYPE_HINT_NORMAL, true);
setMenuBar(((Frame) awtComponent).getMenuBar());
awtComponent.setForeground(java.awt.SystemColor.windowText);
}
public void getArgs (Component component, GtkArgList args)
{
super.getArgs (component, args);
Frame frame = (Frame) awtComponent;
Frame frame = (Frame) component;
setMenuBar (frame.getMenuBar ());
args.add ("title", frame.getTitle ());
args.add ("allow_shrink", frame.isResizable ());
args.add ("allow_grow", frame.isResizable ());
setTitle (frame.getTitle ());
setResizable (frame.isResizable ());
setIconImage(frame.getIconImage());
}
native void nativeSetIconImageFromDecoder (GdkPixbufDecoder decoder);
native void nativeSetIconImageFromData (int[] pixels, int width, int height);
public void setIconImage (Image image)
{
/* TODO: Waiting on Toolkit Image routines */
if (image != null)
{
GtkImage img = (GtkImage) image;
// FIXME: Image should be loaded, but if not, do image loading here.
if (img.isLoaded())
{
if (img.getSource() instanceof GdkPixbufDecoder)
{
nativeSetIconImageFromDecoder((GdkPixbufDecoder) img.getSource());
}
else
{
int[] pixels = img.getPixelCache();
ColorModel model = img.getColorModel();
int[] data = new int[pixels.length * 4];
for (int i = 0; i < pixels.length; i++)
{
data[i * 4] = model.getRed(pixels[i]);
data[i * 4 + 1] = model.getGreen(pixels[i]);
data[i * 4 + 2] = model.getBlue(pixels[i]);
data[i * 4 + 3] = model.getAlpha(pixels[i]);
}
nativeSetIconImageFromData(data, img.getWidth(null), img.getHeight(null));
}
}
}
}
public Graphics getGraphics ()
......
......@@ -89,6 +89,18 @@ public class GtkImage extends Image implements ImageConsumer
this.observer = observer;
}
public synchronized int[]
getPixelCache ()
{
return pixelCache;
}
public synchronized ColorModel
getColorModel ()
{
return model;
}
public synchronized int
getWidth (ImageObserver observer)
{
......
......@@ -144,7 +144,7 @@ public class GtkListPeer extends GtkComponentPeer
// multiple click.
MouseEvent me = (MouseEvent) e;
if (!me.isConsumed ()
&& (me.getModifiers () & MouseEvent.BUTTON1_MASK) != 0
&& (me.getModifiersEx () & MouseEvent.BUTTON1_DOWN_MASK) != 0
&& me.getClickCount() == 2)
{
String selectedItem = ((List) awtComponent).getSelectedItem ();
......@@ -153,7 +153,7 @@ public class GtkListPeer extends GtkComponentPeer
// something is selected.
if (selectedItem != null)
postActionEvent (((List) awtComponent).getSelectedItem (),
me.getModifiers ());
me.getModifiersEx ());
}
}
......@@ -167,7 +167,7 @@ public class GtkListPeer extends GtkComponentPeer
// Enter only generates an Action event if something is
// selected.
if (selectedItem != null)
postActionEvent (selectedItem, ke.getModifiers ());
postActionEvent (selectedItem, ke.getModifiersEx ());
}
}
......
......@@ -43,7 +43,18 @@ public class GtkMainThread extends GtkGenericPeer implements Runnable
private static Thread mainThread = null;
private static Object mainThreadLock = new Object();
static native void gtkInit();
// Whether the gtk+ subsystem has been initialized.
private boolean gtkInitCalled = false;
/**
* Call gtk_init. It is very important that this happen before any other
* gtk calls.
*
* @param portableNativeSync 1 if the Java property
* gnu.classpath.awt.gtk.portable.native.sync is set to "true". 0 if it is
* set to "false". -1 if unset.
*/
static native void gtkInit(int portableNativeSync);
native void gtkMain();
public GtkMainThread()
......@@ -59,18 +70,38 @@ public class GtkMainThread extends GtkGenericPeer implements Runnable
synchronized (this)
{
mainThread.start();
try {
wait();
} catch (InterruptedException e) { }
while (!gtkInitCalled)
{
try
{
wait();
}
catch (InterruptedException e) { }
}
}
}
public void run()
{
/* Pass the value of the gnu.classpath.awt.gtk.portable.native.sync system
* property to C. */
int portableNativeSync;
String portNatSyncProp =
System.getProperty("gnu.classpath.awt.gtk.portable.native.sync");
if (portNatSyncProp == null)
portableNativeSync = -1; // unset
else if (Boolean.valueOf(portNatSyncProp).booleanValue())
portableNativeSync = 1; // true
else
portableNativeSync = 0; // false
synchronized (this)
{
gtkInit();
notify();
gtkInit(portableNativeSync);
gtkInitCalled = true;
notifyAll();
}
gtkMain();
}
......
......@@ -56,15 +56,12 @@ public class GtkMenuBarPeer extends GtkMenuComponentPeer
create ();
}
native void nativeSetHelpMenu(MenuPeer menuPeer);
/* In Gnome, help menus are no longer right flushed. */
public void addHelpMenu (Menu menu)
{
addMenu (menu);
}
public void addMenu (Menu menu)
{
addMenu ((MenuPeer) menu.getPeer ());
nativeSetHelpMenu((MenuPeer) menu.getPeer());
}
native public void delMenu (int index);
......
......@@ -89,10 +89,8 @@ public class GtkMenuItemPeer extends GtkMenuComponentPeer
setEnabled (true);
}
public void setEnabled (boolean b)
{
// do nothing, for now.
}
native public void setEnabled (boolean b);
native public void setLabel (String label);
protected void postMenuActionEvent ()
......
......@@ -52,11 +52,15 @@ public class GtkMenuPeer extends GtkMenuItemPeer
native void create (String label);
native void addItem (MenuItemPeer item, int key, boolean shiftModifier);
native void setupAccelGroup (GtkGenericPeer container);
native void addTearOff ();
public GtkMenuPeer (Menu menu)
{
super (menu);
if (menu.isTearOff())
addTearOff();
MenuContainer parent = menu.getParent ();
if (parent instanceof Menu)
setupAccelGroup ((GtkGenericPeer)((Menu)parent).getPeer ());
......
......@@ -76,7 +76,10 @@ public class GtkOffScreenImage extends Image
public Graphics getGraphics ()
{
return g;
if (g instanceof GdkGraphics2D)
return new GdkGraphics2D ((GdkGraphics2D) this.g);
else
return new GdkGraphics ((GdkGraphics) this.g);
}
public Object getProperty (String name, ImageObserver observer)
......
......@@ -50,6 +50,8 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
implements TextFieldPeer
{
native void create (int width);
native void gtkWidgetSetBackground (int red, int green, int blue);
native void gtkWidgetSetForeground (int red, int green, int blue);
void create ()
{
......@@ -76,6 +78,8 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
int text_width = cols * fm.getMaxAdvance ();
create (text_width);
setEditable (tf.isEditable ());
}
native int gtkEntryGetBorderWidth ();
......@@ -162,7 +166,7 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer
if (!ke.isConsumed ()
&& ke.getKeyCode () == KeyEvent.VK_ENTER)
postActionEvent (getText (), ke.getModifiers ());
postActionEvent (getText (), ke.getModifiersEx ());
}
super.handleEvent (e);
......
......@@ -60,6 +60,10 @@ public class GtkWindowPeer extends GtkContainerPeer
private boolean hasBeenShown = false;
private int oldState = Frame.NORMAL;
native void gtkWindowSetTitle (String title);
native void gtkWindowSetResizable (boolean resizable);
native void gtkWindowSetModal (boolean modal);
native void create (int type, boolean decorated,
int width, int height,
GtkWindowPeer parent,
......@@ -92,6 +96,16 @@ public class GtkWindowPeer extends GtkContainerPeer
create (GDK_WINDOW_TYPE_HINT_NORMAL, false);
}
void setParent ()
{
setVisible (awtComponent.isVisible ());
setEnabled (awtComponent.isEnabled ());
}
void setVisibleAndEnabled ()
{
}
native void connectJObject ();
native void connectSignals ();
......@@ -100,12 +114,6 @@ public class GtkWindowPeer extends GtkContainerPeer
super (window);
}
public void getArgs (Component component, GtkArgList args)
{
args.add ("visible", component.isVisible ());
args.add ("sensitive", component.isEnabled ());
}
native public void toBack ();
native public void toFront ();
......@@ -120,7 +128,7 @@ public class GtkWindowPeer extends GtkContainerPeer
public void setTitle (String title)
{
set ("title", title);
gtkWindowSetTitle (title);
}
native void setSize (int width, int height);
......@@ -132,8 +140,7 @@ public class GtkWindowPeer extends GtkContainerPeer
// was resizable.
setSize (awtComponent.getWidth() - insets.left - insets.right,
awtComponent.getHeight() - insets.top - insets.bottom);
set ("allow_shrink", resizable);
set ("allow_grow", resizable);
gtkWindowSetResizable (resizable);
}
native void setBoundsCallback (Window window,
......
......@@ -409,13 +409,13 @@ public class AWTKeyStroke implements Serializable
{
token = t.nextToken();
if ("shift".equals(token))
modifiers |= KeyEvent.SHIFT_MASK | KeyEvent.SHIFT_DOWN_MASK;
modifiers |= KeyEvent.SHIFT_DOWN_MASK;
else if ("ctrl".equals(token) || "control".equals(token))
modifiers |= KeyEvent.CTRL_MASK | KeyEvent.CTRL_DOWN_MASK;
modifiers |= KeyEvent.CTRL_DOWN_MASK;
else if ("meta".equals(token))
modifiers |= KeyEvent.META_MASK | KeyEvent.META_DOWN_MASK;
modifiers |= KeyEvent.META_DOWN_MASK;
else if ("alt".equals(token))
modifiers |= KeyEvent.ALT_MASK | KeyEvent.ALT_DOWN_MASK;
modifiers |= KeyEvent.ALT_DOWN_MASK;
else if ("button1".equals(token))
modifiers |= KeyEvent.BUTTON1_DOWN_MASK;
else if ("button2".equals(token))
......
......@@ -101,7 +101,7 @@ private transient ActionListener action_listeners;
public
Button()
{
this(null);
this("");
}
/*************************************************************************/
......
......@@ -506,7 +506,7 @@ public class Color implements Paint, Serializable
/**
* Returns the RGB value for this color, in the sRGB color space. The blue
* value will be in bits 0-7, green in 8-15, red in 6-23, and alpha value in
* value will be in bits 0-7, green in 8-15, red in 16-23, and alpha value in
* 24-31.
*
* @return the RGB value for this color
......@@ -772,9 +772,9 @@ public class Color implements Paint, Serializable
if (red == max)
array[0] = (green - blue) / delta;
else if (green == max)
array[0] = 1 / 3 + (blue - red) / delta;
array[0] = 1f / 3 + (blue - red) / delta;
else
array[0] = 2 / 3 + (red - green) / delta;
array[0] = 2f / 3 + (red - green) / delta;
if (array[0] < 0)
array[0]++;
}
......
......@@ -1505,10 +1505,11 @@ public class Container extends Component
void dispatchEventImpl(AWTEvent e)
{
// Give lightweight dispatcher a chance to handle it.
if (dispatcher != null
if (eventTypeEnabled (e.id)
&& dispatcher != null
&& dispatcher.handleEvent (e))
return;
if ((e.id <= ContainerEvent.CONTAINER_LAST
&& e.id >= ContainerEvent.CONTAINER_FIRST)
&& (containerListener != null
......@@ -1586,7 +1587,6 @@ public class Container extends Component
{
if (dispatcher == null)
dispatcher = new LightweightDispatcher (this);
dispatcher.enableEvents (component[i].eventMask);
}
......@@ -1831,7 +1831,6 @@ class LightweightDispatcher implements Serializable
{
private static final long serialVersionUID = 5184291520170872969L;
private Container nativeContainer;
private Component focus;
private Cursor nativeCursor;
private long eventMask;
......@@ -1845,11 +1844,6 @@ class LightweightDispatcher implements Serializable
nativeContainer = c;
}
void enableEvents(long l)
{
eventMask |= l;
}
void acquireComponentForMouseEvent(MouseEvent me)
{
int x = me.getX ();
......@@ -1863,8 +1857,9 @@ class LightweightDispatcher implements Serializable
{
candidate =
SwingUtilities.getDeepestComponentAt(parent, p.x, p.y);
if (candidate == null)
if (candidate == null || (candidate.eventMask & me.getID()) == 0)
{
candidate = null;
p = SwingUtilities.convertPoint(parent, p.x, p.y, parent.parent);
parent = parent.parent;
}
......@@ -1881,21 +1876,25 @@ class LightweightDispatcher implements Serializable
&& lastComponentEntered.isShowing()
&& lastComponentEntered != candidate)
{
Point tp =
SwingUtilities.convertPoint(nativeContainer,
x, y, lastComponentEntered);
MouseEvent exited = new MouseEvent (lastComponentEntered,
MouseEvent.MOUSE_EXITED,
me.getWhen (),
me.getModifiers (),
tp.x, tp.y,
me.getClickCount (),
me.isPopupTrigger (),
me.getButton ());
lastComponentEntered.dispatchEvent (exited);
// Old candidate could have been removed from
// the nativeContainer so we check first.
if (SwingUtilities.isDescendingFrom(lastComponentEntered, nativeContainer))
{
Point tp =
SwingUtilities.convertPoint(nativeContainer,
x, y, lastComponentEntered);
MouseEvent exited = new MouseEvent (lastComponentEntered,
MouseEvent.MOUSE_EXITED,
me.getWhen (),
me.getModifiersEx (),
tp.x, tp.y,
me.getClickCount (),
me.isPopupTrigger (),
me.getButton ());
lastComponentEntered.dispatchEvent (exited);
}
lastComponentEntered = null;
}
// If we have a candidate, maybe enter it.
if (candidate != null)
{
......@@ -1911,7 +1910,7 @@ class LightweightDispatcher implements Serializable
MouseEvent entered = new MouseEvent (lastComponentEntered,
MouseEvent.MOUSE_ENTERED,
me.getWhen (),
me.getModifiers (),
me.getModifiersEx (),
cp.x, cp.y,
me.getClickCount (),
me.isPopupTrigger (),
......@@ -1929,7 +1928,8 @@ class LightweightDispatcher implements Serializable
// - MOUSE_RELEASED
// - MOUSE_PRESSED: another button pressed while the first is held down
// - MOUSE_DRAGGED
mouseEventTarget = pressedComponent;
if (SwingUtilities.isDescendingFrom(pressedComponent, nativeContainer))
mouseEventTarget = pressedComponent;
else if (me.getID() == MouseEvent.MOUSE_CLICKED)
{
// Don't dispatch CLICKED events whose target is not the same as the
......@@ -1943,9 +1943,6 @@ class LightweightDispatcher implements Serializable
boolean handleEvent(AWTEvent e)
{
if ((eventMask & e.getID()) == 0)
return false;
if (e instanceof MouseEvent)
{
MouseEvent me = (MouseEvent) e;
......@@ -1979,12 +1976,10 @@ class LightweightDispatcher implements Serializable
pressedComponent = null;
break;
}
if (newEvt.isConsumed())
e.consume();
}
}
else if (e instanceof KeyEvent && focus != null)
{
focus.processKeyEvent((KeyEvent) e);
}
return e.isConsumed();
}
......
......@@ -92,19 +92,17 @@ public class DefaultFocusTraversalPolicy
&& comp.enabled)
{
if (comp.isFocusTraversableOverridden != 0
&& comp.isFocusTraversable ())
return true;
else
{
if (!(comp instanceof Canvas
|| comp instanceof Panel
|| comp instanceof Label
|| comp instanceof ScrollPane
|| comp instanceof Scrollbar
|| comp instanceof Window
|| comp.isLightweight ()))
return true;
}
&& (comp.isFocusTraversable () || comp.isFocusable()))
return true;
if (!(comp instanceof Canvas
|| comp instanceof Panel
|| comp instanceof Label
|| comp instanceof ScrollPane
|| comp instanceof Scrollbar
|| comp instanceof Window
|| comp.isLightweight ()))
return true;
}
return false;
}
......
......@@ -155,7 +155,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
&& e.id != WindowEvent.WINDOW_DEACTIVATED)
return false;
target.dispatchEvent (e);
redispatchEvent(target, e);
return true;
}
else if (e instanceof FocusEvent)
......@@ -197,7 +197,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
setGlobalPermanentFocusOwner (null);
}
target.dispatchEvent (e);
redispatchEvent(target, e);
return true;
}
......@@ -258,7 +258,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
Component focusOwner = getGlobalPermanentFocusOwner ();
if (focusOwner != null)
focusOwner.dispatchEvent (e);
redispatchEvent(focusOwner, e);
// Loop through all registered KeyEventPostProcessors, giving
// each a chance to process this event.
......@@ -284,10 +284,10 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
{
// Check if this event represents a menu shortcut.
// MenuShortcuts are activated by Ctrl- KeyEvents.
int modifiers = e.getModifiers ();
if ((modifiers & KeyEvent.CTRL_MASK) != 0
|| (modifiers & KeyEvent.CTRL_DOWN_MASK) != 0)
// MenuShortcuts are activated by Ctrl- KeyEvents, only on KEY_PRESSED.
int modifiers = e.getModifiersEx ();
if (e.getID() == KeyEvent.KEY_PRESSED
&& (modifiers & KeyEvent.CTRL_DOWN_MASK) != 0)
{
Window focusedWindow = getGlobalFocusedWindow ();
if (focusedWindow instanceof Frame)
......@@ -311,17 +311,21 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
MenuItem item = menu.getItem (j);
MenuShortcut shortcut = item.getShortcut ();
if (shortcut != null)
if (item.isEnabled() && shortcut != null)
{
// Dispatch a new ActionEvent if this is a
// Shift- KeyEvent and the shortcut requires
// the Shift modifier, or if the shortcut
// doesn't require the Shift modifier.
if ((shortcut.usesShiftModifier ()
&& ((modifiers & KeyEvent.SHIFT_MASK) != 0
|| (modifiers & KeyEvent.SHIFT_DOWN_MASK) != 0)
|| !shortcut.usesShiftModifier ())
&& shortcut.getKey () == e.getKeyCode ())
// Dispatch a new ActionEvent if:
//
// a) this is a Shift- KeyEvent, and the
// shortcut requires the Shift modifier
//
// or, b) this is not a Shift- KeyEvent, and the
// shortcut does not require the Shift
// modifier.
if (shortcut.getKey () == e.getKeyCode ()
&& ((shortcut.usesShiftModifier ()
&& (modifiers & KeyEvent.SHIFT_DOWN_MASK) != 0)
|| (! shortcut.usesShiftModifier ()
&& (modifiers & KeyEvent.SHIFT_DOWN_MASK) == 0)))
{
item.dispatchEvent (new ActionEvent (item,
ActionEvent.ACTION_PERFORMED,
......@@ -347,7 +351,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
// KEY_PRESSED TAB is a focus traversal keystroke, we also need to
// consume KEY_RELEASED and KEY_TYPED TAB key events).
AWTKeyStroke oppositeKeystroke = AWTKeyStroke.getAWTKeyStroke (e.getKeyCode (),
e.getModifiers (),
e.getModifiersEx (),
!(e.id == KeyEvent.KEY_RELEASED));
Set forwardKeystrokes = comp.getFocusTraversalKeys (KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS);
......@@ -439,7 +443,8 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy ();
Component previous = policy.getComponentBefore (focusCycleRoot, focusComp);
previous.requestFocusInWindow ();
if (previous != null)
previous.requestFocusInWindow ();
}
public void focusNextComponent (Component comp)
......@@ -449,7 +454,8 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy ();
Component next = policy.getComponentAfter (focusCycleRoot, focusComp);
next.requestFocusInWindow ();
if (next != null)
next.requestFocusInWindow ();
}
public void upFocusCycle (Component comp)
......@@ -461,7 +467,8 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
{
FocusTraversalPolicy policy = focusCycleRoot.getFocusTraversalPolicy ();
Component defaultComponent = policy.getDefaultComponent (focusCycleRoot);
defaultComponent.requestFocusInWindow ();
if (defaultComponent != null)
defaultComponent.requestFocusInWindow ();
}
else
{
......@@ -481,7 +488,8 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager
{
FocusTraversalPolicy policy = cont.getFocusTraversalPolicy ();
Component defaultComponent = policy.getDefaultComponent (cont);
defaultComponent.requestFocusInWindow ();
if (defaultComponent != null)
defaultComponent.requestFocusInWindow ();
setGlobalCurrentFocusCycleRoot (cont);
}
}
......
......@@ -1265,12 +1265,28 @@ equals(Object obj)
public String
toString()
{
return(getClass().getName()
+ "(logical=" + getName ()
+ ",family=" + getFamily ()
+ ",name=" + getFontName ()
+ ",style=" + getStyle ()
+ ",size=" + getSize ());
String styleString = "";
switch (getStyle ())
{
case 0:
styleString = "plain";
break;
case 1:
styleString = "bold";
break;
case 2:
styleString = "italic";
break;
default:
styleString = "unknown";
}
return getClass ().getName ()
+ "[family=" + getFamily ()
+ ",name=" + getFontName ()
+ ",style=" + styleString
+ ",size=" + getSize () + "]";
}
......
......@@ -732,14 +732,14 @@ finalize()
/*************************************************************************/
/**
* Returns a string representation of this object.
*
* @param A string representation of this object.
*/
* Returns a string representation of this object.
*
* @param A string representation of this object.
*/
public String
toString()
{
return(super.toString());
return getClass ().getName () + "[font=" + getFont () + ",color=" + getColor () + "]";
}
public boolean
......
......@@ -740,8 +740,11 @@ public abstract class KeyboardFocusManager
public final void redispatchEvent (Component target, AWTEvent e)
{
e.setSource (target);
dispatchEvent (e);
synchronized (e)
{
e.setSource (target);
target.dispatchEvent (e);
}
}
public abstract boolean dispatchKeyEvent (KeyEvent e);
......
......@@ -128,15 +128,15 @@ setHelpMenu(Menu menu)
helpMenu.removeNotify ();
helpMenu.parent = null;
}
helpMenu = menu;
if (menu.parent != null)
menu.parent.remove (menu);
if (menu.parent != null)
menu.parent.remove (menu);
menu.parent = this;
if (peer != null)
{
menu.addNotify();
MenuBarPeer mp = (MenuBarPeer) peer;
mp.addHelpMenu (menu);
}
......@@ -163,8 +163,7 @@ add(Menu menu)
if (peer != null)
{
MenuBarPeer mp = (MenuBarPeer) peer;
mp.addMenu (menu);
menu.addNotify();
}
return(menu);
......@@ -269,6 +268,11 @@ addNotify()
Menu mi = (Menu)e.nextElement();
mi.addNotify();
}
if (helpMenu != null)
{
helpMenu.addNotify();
((MenuBarPeer) peer).addHelpMenu(helpMenu);
}
}
/*************************************************************************/
......
......@@ -77,7 +77,7 @@ private String actionCommand;
/**
* @serial Indicates whether or not this menu item is enabled.
*/
private boolean enabled;
private boolean enabled = true;
/**
* @serial The mask of events that are enabled for this menu item.
......
......@@ -542,7 +542,7 @@ public class Rectangle extends Rectangle2D implements Shape, Serializable
*/
public boolean intersects(Rectangle r)
{
return width > 0 && height > 0 && r.width > 0 && r.height > 0
return r.width > 0 && r.height > 0 && width > 0 && height > 0
&& r.x < x + width && r.x + r.width > x
&& r.y < y + height && r.y + r.height > y;
}
......
......@@ -60,7 +60,6 @@ public class DirectColorModel extends PackedColorModel
* @param rmask the bits describing the red component of a pixel
* @param gmask the bits describing the green component of a pixel
* @param bmask the bits describing the blue component of a pixel
* @param amask the bits describing the alpha component of a pixel
*/
public DirectColorModel(int pixelBits, int rmask, int gmask, int bmask)
{
......@@ -82,6 +81,7 @@ public class DirectColorModel extends PackedColorModel
* @param rmask the bits describing the red component of a pixel
* @param gmask the bits describing the green component of a pixel
* @param bmask the bits describing the blue component of a pixel
* @param amask the bits describing the alpha component of a pixel
*/
public DirectColorModel(int pixelBits,
int rmask, int gmask, int bmask, int amask)
......
......@@ -117,7 +117,7 @@ public class Kernel implements Cloneable
throws IllegalArgumentException
{
if (data == null)
return (float[])this.data.clone();
return (float[])this.data.clone();
if (data.length < this.data.length)
throw new IllegalArgumentException();
......@@ -131,6 +131,13 @@ public class Kernel implements Cloneable
*/
public Object clone()
{
return new Kernel(width, height, data);
try
{
return super.clone();
}
catch (CloneNotSupportedException e)
{
throw (Error) new InternalError().initCause(e); // Impossible
}
}
}
......@@ -43,7 +43,6 @@ import java.awt.Menu;
public interface MenuBarPeer extends MenuComponentPeer
{
void addHelpMenu(Menu menu);
void addMenu(Menu menu);
void delMenu(int index);
} // interface MenuBarPeer
......@@ -51,7 +51,6 @@ import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.EventListener;
import javax.accessibility.AccessibleAction;
import javax.accessibility.AccessibleIcon;
......@@ -214,24 +213,28 @@ public abstract class AbstractButton extends JComponent
Action action;
/** The button's current state. */
ButtonModel model;
protected ButtonModel model;
/** The margin between the button's border and its label. */
Insets margin;
/** a hint to the look and feel class, suggesting which character in the
/** A hint to the look and feel class, suggesting which character in the
* button's label should be underlined when drawing the label. */
int mnemonicIndex;
/** Listener the button uses to receive ActionEvents from its model. */
ActionListener actionListener;
protected ActionListener actionListener;
/** Listener the button uses to receive ItemEvents from its model. */
ItemListener itemListener;
protected ItemListener itemListener;
/** Listener the button uses to receive ChangeEvents from its model. */
ChangeListener changeListener;
protected ChangeListener changeListener;
/** The time in miliseconds in which clicks get coalesced into a single
* <code>ActionEvent</code>. */
long multiClickThreshhold;
/** Listener the button uses to receive PropertyChangeEvents from its
Action. */
PropertyChangeListener actionPropertyChangeListener;
......@@ -296,9 +299,9 @@ public abstract class AbstractButton extends JComponent
/** Fired in a PropertyChangeEvent when the "verticalTextPosition" property changes. */
public static final String VERTICAL_TEXT_POSITION_CHANGED_PROPERTY = "verticalTextPosition";
/**
/**
* A Java Accessibility extension of the AbstractButton.
*/
*/
protected abstract class AccessibleAbstractButton
extends AccessibleJComponent implements AccessibleAction, AccessibleValue,
AccessibleText
......@@ -430,7 +433,7 @@ public abstract class AbstractButton extends JComponent
}
public String getSelectedText()
{
{
return null; // TODO
}
......@@ -440,33 +443,6 @@ public abstract class AbstractButton extends JComponent
}
}
/**
* Helper class used to subscribe to FocusEvents received by the button.
*/
private class ButtonFocusListener implements FocusListener
{
/**
* Possibly repaint the model in response to loss of focus.
*
* @param event The loss-of-focus event
*/
public void focusLost(FocusEvent event)
{
if (AbstractButton.this.isFocusPainted())
AbstractButton.this.repaint();
}
/**
* Possibly repaint the button in response to acquisition of focus.
*
* @param event The gained-focus event
*/
public void focusGained(FocusEvent event)
{
if (AbstractButton.this.isFocusPainted())
AbstractButton.this.repaint();
}
}
/**
* Creates a new AbstractButton object.
......@@ -549,12 +525,12 @@ public abstract class AbstractButton extends JComponent
borderPainted = true;
contentAreaFilled = true;
iconTextGap = 4;
focusPainted = true;
setFocusable(true);
setAlignmentX(LEFT_ALIGNMENT);
setAlignmentY(CENTER_ALIGNMENT);
addFocusListener(new ButtonFocusListener());
setDisplayedMnemonicIndex(-1);
}
......@@ -602,6 +578,18 @@ public abstract class AbstractButton extends JComponent
}
/**
* Returns all added <code>ActionListener</code> objects.
*
* @return an array of listeners
*
* @since 1.4
*/
public ActionListener[] getActionListeners()
{
return (ActionListener[]) listenerList.getListeners(ActionListener.class);
}
/**
* Adds an ItemListener to the button's listener list. When the button's
* model changes state (between any of ARMED, ENABLED, PRESSED, ROLLOVER
* or SELECTED) it fires an ItemEvent, and these listeners will be
......@@ -625,6 +613,18 @@ public abstract class AbstractButton extends JComponent
}
/**
* Returns all added <code>ItemListener</code> objects.
*
* @return an array of listeners
*
* @since 1.4
*/
public ItemListener[] getItemListeners()
{
return (ItemListener[]) listenerList.getListeners(ItemListener.class);
}
/**
* Adds a ChangeListener to the button's listener list. When the button's
* model changes any of its (non-bound) properties, these listeners will be
* called.
......@@ -647,6 +647,18 @@ public abstract class AbstractButton extends JComponent
}
/**
* Returns all added <code>ChangeListener</code> objects.
*
* @return an array of listeners
*
* @since 1.4
*/
public ChangeListener[] getChangeListeners()
{
return (ChangeListener[]) listenerList.getListeners(ChangeListener.class);
}
/**
* Calls {@link ItemListener.itemStateChanged} on each ItemListener in
* the button's listener list.
*
......@@ -655,9 +667,10 @@ public abstract class AbstractButton extends JComponent
public void fireItemStateChanged(ItemEvent e)
{
e.setSource(this);
EventListener[] ll = listenerList.getListeners(ItemListener.class);
for (int i = 0; i < ll.length; i++)
((ItemListener)ll[i]).itemStateChanged(e);
ItemListener[] listeners = getItemListeners();
for (int i = 0; i < listeners.length; i++)
listeners[i].itemStateChanged(e);
}
/**
......@@ -669,9 +682,10 @@ public abstract class AbstractButton extends JComponent
public void fireActionPerformed(ActionEvent e)
{
e.setSource(this);
EventListener[] ll = listenerList.getListeners(ActionListener.class);
for (int i = 0; i < ll.length; i++)
((ActionListener)ll[i]).actionPerformed(e);
ActionListener[] listeners = getActionListeners();
for (int i = 0; i < listeners.length; i++)
listeners[i].actionPerformed(e);
}
/**
......@@ -683,9 +697,10 @@ public abstract class AbstractButton extends JComponent
*/
public void fireStateChanged(ChangeEvent e)
{
EventListener[] ll = listenerList.getListeners(ChangeListener.class);
for (int i = 0; i < ll.length; i++)
((ChangeListener)ll[i]).stateChanged(changeEvent);
ChangeListener[] listeners = getChangeListeners();
for (int i = 0; i < listeners.length; i++)
listeners[i].stateChanged(changeEvent);
}
/**
......@@ -1879,4 +1894,33 @@ public abstract class AbstractButton extends JComponent
public void updateUI()
{
}
/**
* Returns the current time in milliseconds in which clicks gets coalesced
* into a single <code>ActionEvent</code>.
*
* @return the time in milliseconds
*
* @since 1.4
*/
public long getMultiClickThreshhold()
{
return multiClickThreshhold;
}
/**
* Sets the time in milliseconds in which clicks gets coalesced into a single
* <code>ActionEvent</code>.
*
* @param threshhold the time in milliseconds
*
* @since 1.4
*/
public void setMultiClickThreshhold(long threshhold)
{
if (threshhold < 0)
throw new IllegalArgumentException();
multiClickThreshhold = threshhold;
}
}
......@@ -86,8 +86,8 @@ public class ActionMap
{
Object result = actionMap.get(key);
if (result == null)
result = parent.get(key);
if (result == null && parent != null)
result = parent.get(key);
return (Action) result;
}
......
......@@ -47,7 +47,11 @@ import java.awt.Dimension;
import java.awt.AWTError;
/**
* Needs some work I guess....
* A component that uses a {@link BoxLayout} as Layout Manager.
*
* In addition to that, this class provides a set of static methods for
* creating some filler components ('struts' and 'glue') for use in
* containers that are laid out using BoxLayout.
*
* @author Ronald Veldema (rveldema@cs.vu.nl)
*/
......@@ -69,7 +73,10 @@ public class Box extends JComponent implements Accessible
return null;
}
}
/**
* A component that servers as a filler in BoxLayout controlled containers.
*/
public static class Filler extends JComponent implements Accessible
{
private static final long serialVersionUID = -1204263191910183998L;
......@@ -93,11 +100,25 @@ public class Box extends JComponent implements Accessible
private transient Dimension min, pref, max;
/**
* Creates a new instance of Filler.
*
* @param min the minimum size of the filler.
* @param pref the preferred size of the filler.
* @param max the maximum size of the filler.
*/
public Filler(Dimension min, Dimension pref, Dimension max)
{
changeShape(min, pref, max);
}
/**
* Changes the dimensions of this Filler.
*
* @param min the new minimum size of the filler.
* @param pref the new preferred size of the filler.
* @param max the new maximum size of the filler.
*/
public void changeShape(Dimension min, Dimension pref, Dimension max)
{
this.min = min;
......@@ -113,65 +134,137 @@ public class Box extends JComponent implements Accessible
return accessibleContext;
}
/**
* Returns the maximum size of this Filler.
*
* @return the maximum size of this Filler.
*/
public Dimension getMaximumSize()
{
return max;
}
/**
* Returns the minimum size of this Filler.
*
* @return the minimum size of this Filler.
*/
public Dimension getMinimumSize()
{
return min;
}
/**
* Returns the preferred size of this Filler.
*
* @return the preferred size of this Filler.
*/
public Dimension getPreferredSize()
{
return pref;
}
}
/**
* Creates a new Box component, that lays out its children according
* to the <code>axis</code> parameter.
*
* @param axis the orientation of the BoxLayout.
*
* @see BoxLayout#X_AXIS
* @see BoxLayout#Y_AXIS
* @see BoxLayout#LINE_AXIS
* @see BoxLayout#PAGE_AXIS
*/
public Box(int axis)
{
setLayout(new BoxLayout(this, axis));
super.setLayout(new BoxLayout(this, axis));
}
/**
* Creates a filler component which acts as glue between components.
* It does not take space unless some extra space is available. If extra
* space is available, this component can expand in both X and Y directions.
*
* @return a glue-like filler component.
*/
public static Component createGlue()
{
return null;
Filler glue = new Filler(new Dimension(0,0), new Dimension(0,0),
new Dimension(Integer.MAX_VALUE,Integer.MAX_VALUE)
);
return glue;
}
public static Box createHorizontalBox()
{
return null;
return new Box(BoxLayout.X_AXIS);
}
/**
* Creates a filler component which acts as glue between components.
* It does not take space unless some extra space is available. If extra
* space is available, this component can expand in the X direction.
*
* @return a glue-like filler component.
*/
public static Component createHorizontalGlue()
{
return null;
return createGlue();
}
/**
* Creates a filler component which acts as strut between components.
* It will fill exactly the specified horizontal size.
*
* @param width the width of this strut in pixels.
*
* @return a strut-like filler component.
*/
public static Component createHorizontalStrut(int width)
{
return null;
Filler strut = new Filler(new Dimension(width, 0),
new Dimension(width, 0),
new Dimension(width, Integer.MAX_VALUE));
return strut;
}
public static Component createRigidArea(Dimension d)
{
return null;
return new Filler(d, d, d);
}
public static Box createVerticalBox()
{
return null;
return new Box(BoxLayout.Y_AXIS);
}
/**
* Creates a filler component which acts as glue between components.
* It does not take space unless some extra space is available. If extra
* space is available, this component can expand in the Y direction.
*
* @return a glue-like filler component.
*/
public static Component createVerticalGlue()
{
return null;
return createGlue();
}
/**
* Creates a filler component which acts as strut between components.
* It will fill exactly the specified vertical size.
*
* @param height the height of this strut in pixels.
*
* @return a strut-like filler component.
*/
public static Component createVerticalStrut(int height)
{
return null;
Filler strut = new Filler(new Dimension(0, height),
new Dimension(0, height),
new Dimension(Integer.MAX_VALUE, height));
return strut;
}
public void setLayout(LayoutManager l)
......
......@@ -42,15 +42,11 @@ import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.LayoutManager2;
import java.io.Serializable;
/**
* A layout for swing components.
* This implementation delegates its methods to
* java.awt.GridLayout to do its work.
*
* @author Ronald Veldema (rveldema@cs.vu.nl)
*/
......@@ -87,11 +83,6 @@ public class BoxLayout implements LayoutManager2, Serializable
private Container container;
/*
* Internal layout.
*/
private GridLayout grid;
/*
* Current type of component layouting. Defaults to X_AXIS.
*/
private int way = X_AXIS;
......@@ -108,75 +99,41 @@ public class BoxLayout implements LayoutManager2, Serializable
{
int width = 0;
int height = 0;
ComponentOrientation orientation = container.getComponentOrientation();
this.container = container;
this.way = way;
switch (way)
{
case X_AXIS:
width = 1;
break;
case Y_AXIS:
height = 1;
break;
case LINE_AXIS:
if (orientation.isHorizontal())
height = 1;
else
width = 1;
break;
case PAGE_AXIS:
if (!orientation.isHorizontal())
height = 1;
else
width = 1;
break;
default:
throw new AWTError("Invalid value for way");
}
grid = new GridLayout(width, height);
}
/**
* Adds a component to the layout.
* Adds a component to the layout. Not used in BoxLayout.
*
* @param name The name of the component to add.
* @param component the component to add to the layout.
*/
public void addLayoutComponent(String name, Component component)
{
if (way == X_AXIS
|| (way == LINE_AXIS
&& component.getComponentOrientation().isHorizontal())
|| (way == PAGE_AXIS
&& !component.getComponentOrientation().isHorizontal()))
grid.setColumns(grid.getColumns() + 1);
else
grid.setRows(grid.getRows() + 1);
}
/**
* Removes a component from the layout.
* Removes a component from the layout. Not used in BoxLayout.
*
* @param component The component to remove from the layout.
*/
public void removeLayoutComponent(Component component)
{
grid.removeLayoutComponent(component);
if (way == X_AXIS
|| (way == LINE_AXIS
&& component.getComponentOrientation().isHorizontal())
|| (way == PAGE_AXIS
&& !component.getComponentOrientation().isHorizontal()))
grid.setColumns(grid.getColumns() - 1);
else
grid.setRows(grid.getRows() - 1);
}
private boolean isHorizontalIn(Container parent)
{
ComponentOrientation orientation = parent.getComponentOrientation();
return this.way == X_AXIS
|| (this.way == LINE_AXIS
&& orientation.isHorizontal())
|| (this.way == PAGE_AXIS
&& (!orientation.isHorizontal()));
}
/**
* Returns the preferred size of the layout.
*
......@@ -188,8 +145,38 @@ public class BoxLayout implements LayoutManager2, Serializable
{
if (parent != container)
throw new AWTError("invalid parent");
int x = 0;
int y = 0;
Component[] children = parent.getComponents();
if (isHorizontalIn(parent))
{
// sum up preferred widths of components, find maximum of preferred
// heights
for (int index = 0; index < children.length; index++)
{
Component comp = children[index];
Dimension sz = comp.getPreferredSize();
x += sz.width;
y = Math.max(y, sz.height);
}
}
else
{
// sum up preferred heights of components, find maximum of
// preferred widths
for (int index = 0; index < children.length; index++)
{
Component comp = children[index];
Dimension sz = comp.getPreferredSize();
y += sz.height;
x = Math.max(x, sz.width);
}
}
return grid.preferredLayoutSize(parent);
return new Dimension(x, y);
}
/**
......@@ -203,8 +190,38 @@ public class BoxLayout implements LayoutManager2, Serializable
{
if (parent != container)
throw new AWTError("invalid parent");
int x = 0;
int y = 0;
Component[] children = parent.getComponents();
if (isHorizontalIn(parent))
{
// sum up preferred widths of components, find maximum of preferred
// heights
for (int index = 0; index < children.length; index++)
{
Component comp = children[index];
Dimension sz = comp.getMinimumSize();
x += sz.width;
y = Math.max(y, sz.height);
}
}
else
{
// sum up preferred heights of components, find maximum of
// preferred widths
for (int index = 0; index < children.length; index++)
{
Component comp = children[index];
Dimension sz = comp.getMinimumSize();
y += sz.height;
x = Math.max(x, sz.width);
}
}
return grid.minimumLayoutSize(parent);
return new Dimension(x, y);
}
/**
......@@ -216,19 +233,69 @@ public class BoxLayout implements LayoutManager2, Serializable
{
if (parent != container)
throw new AWTError("invalid parent");
grid.layoutContainer(parent);
}
Dimension size = parent.getSize();
Component[] children = parent.getComponents();
if (isHorizontalIn(parent))
{
int x = 0;
for (int index = 0; index < children.length; index++)
{
Component comp = children[index];
Dimension sz = comp.getPreferredSize();
int width = sz.width;
int height = sz.height;
int cy = 0;
if (height > size.height)
{
height = size.height;
}
else
{
cy = (int) ((size.height - height) * comp.getAlignmentY());
}
comp.setSize(width, height);
comp.setLocation(x, cy);
x = x + width;
}
}
else
{
int y = 0;
for (int index = 0; index < children.length; index++)
{
Component comp = children[index];
Dimension sz = comp.getPreferredSize();
int width = sz.width;
int height = sz.height;
int cx = 0;
if (width > size.width)
{
width = size.width;
}
else
{
cx = (int) ((size.width - width) * comp.getAlignmentX());
}
comp.setSize(width, height);
comp.setLocation(cx, y);
y = y + height;
}
}
}
/**
* Adds a component to the layout.
* Adds a component to the layout. Not used in BoxLayout
*
* @param child The component to add to the layout.
* @param constraints The constraints for the component in the layout.
*/
public void addLayoutComponent(Component child, Object constraints)
{
addLayoutComponent("", child);
}
/**
......@@ -284,7 +351,37 @@ public class BoxLayout implements LayoutManager2, Serializable
{
if (parent != container)
throw new AWTError("invalid parent");
return preferredLayoutSize(parent);
int x = 0;
int y = 0;
Component[] children = parent.getComponents();
if (isHorizontalIn(parent))
{
// sum up preferred widths of components, find maximum of preferred
// heights
for (int index = 0; index < children.length; index++)
{
Component comp = children[index];
Dimension sz = comp.getMaximumSize();
x += sz.width;
y = Math.max(y, sz.height);
}
}
else
{
// sum up preferred heights of components, find maximum of
// preferred widths
for (int index = 0; index < children.length; index++)
{
Component comp = children[index];
Dimension sz = comp.getMaximumSize();
y += sz.height;
x = Math.max(x, sz.width);
}
}
return new Dimension(x, y);
}
}
......@@ -42,19 +42,18 @@ import java.util.Enumeration;
import java.util.Vector;
public class ButtonGroup
implements Serializable
/**
* DOCUMENT ME!
*/
public class ButtonGroup implements Serializable
{
/** DOCUMENT ME! */
private static final long serialVersionUID = 4259076101881721375L;
/**
* The buttons added to this button group.
*/
/** The buttons added to this button group. */
protected Vector buttons = new Vector();
/**
* The currently selected button model.
*/
/** The currently selected button model. */
ButtonModel sel;
/**
......@@ -99,17 +98,24 @@ public class ButtonGroup
/**
* Returns the currently selected button model.
*
* @return the currently selected button model,
* null if none was selected yet
* @return the currently selected button model, null if none was selected
* yet
*/
public ButtonModel getSelection()
{
return sel;
}
/**
* DOCUMENT ME!
*
* @param m DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
AbstractButton FindButton(ButtonModel m)
{
for (int i = 0;i < buttons.size(); i++)
for (int i = 0; i < buttons.size(); i++)
{
AbstractButton a = (AbstractButton) buttons.get(i);
if (a.getModel() == m)
......@@ -119,46 +125,40 @@ public class ButtonGroup
}
/**
* Sets the currently selected button model. Only one button of a group
* can be selected at a time.
* Sets the currently selected button model. Only one button of a group can
* be selected at a time.
*
* @param m the model to select
* @param b true if this button is to be selected, false otherwise
*/
public void setSelected(ButtonModel m, boolean b)
{
if ((m == sel) && (b == true))
{
// clicked on same item twice.
System.out.println("PRESSED TWICE:" + m + ", sel=" + sel);
return;
}
if ((sel != m || b) && (! b || sel == m))
return;
if (sel != null)
if (b && sel != m)
{
System.out.println("DESELECTING: " + sel);
sel.setSelected(! b);
AbstractButton but = FindButton(sel);
if (but != null)
{
System.out.println("REPAINT-REQUEST: " + but.text);
//but.revalidate();
but.repaint();
}
ButtonModel old = sel;
sel = m;
if (old != null)
old.setSelected(false);
AbstractButton button = FindButton(old);
if (button != null)
button.repaint();
}
else
System.out.println("NO SELECTION YET");
sel = m;
else if (! b && sel == m)
m.setSelected(true);
}
/**
* Checks if the given <code>ButtonModel</code> is selected
* in this button group.
* Checks if the given <code>ButtonModel</code> is selected in this button
* group.
*
* @param m DOCUMENT ME!
*
* @return true of given <code>ButtonModel</code> is selected,
* false otherwise
* @return true of given <code>ButtonModel</code> is selected, false
* otherwise
*/
public boolean isSelected(ButtonModel m)
{
......
......@@ -42,49 +42,56 @@ import java.awt.event.ActionListener;
/**
* ComboBoxEditor
* @author Andrew Selkirk
* @version 1.0
*
* @author Andrew Selkirk
* @author Olga Rodimina
* @version 1.0
*/
public interface ComboBoxEditor {
//-------------------------------------------------------------
// Methods ----------------------------------------------------
//-------------------------------------------------------------
/**
* getEditorComponent
* @returns Component
*/
Component getEditorComponent();
/**
* setItem
* @param item TODO
*/
void setItem(Object item);
/**
* getItem
* @returns Object
*/
Object getItem();
/**
* selectAll
*/
void selectAll();
/**
* addActionListener
* @param listener TODO
*/
void addActionListener(ActionListener listener);
/**
* removeActionListener
* @param listener TODO
*/
void removeActionListener(ActionListener listener);
public interface ComboBoxEditor
{
/**
* This method returns component that will be used by the combo box to
* display/edit currently selected item in the combo box.
*
* @return Component that will be used by the combo box to display/edit
* currently selected item
*/
Component getEditorComponent();
/**
* Sets item that should be editted when any editting operation is performed
* by the user. The value is always equal to the currently selected value
* in the combo box. Thus, whenever a different value is selected from the
* combo box list then this method should be called to change editting item
* to the new selected item.
*
* @param selectedItem item that is currently selected in the combo box
*/
void setItem(Object item);
/**
* This method returns item that is currently editable.
*
* @return Item in the combo box that is currently editable
*/
Object getItem();
/**
* selectAll
*/
void selectAll();
/**
* This method adds specified ActionListener to this ComboBoxEditor.
*
* @param listener
*/
void addActionListener(ActionListener listener);
/**
* This method removes given ActionListener from this ComboBoxEditor.
*
* @param listener TODO
*/
void removeActionListener(ActionListener listener);
} // ComboBoxEditor
......@@ -37,28 +37,32 @@ exception statement from your version. */
package javax.swing;
/**
* ComboBoxModel
* @author Andrew Selkirk
* @version 1.0
* ComboBoxModel is a data model for JComboBox. This model keeps
* track of elements contained in the JComboBox as well as the current
* combo box selection. Whenever selection in the JComboBox changes, the
* ComboBoxModel should fire ListDataEvents to ComboBox's ListDataListeners.
*
* @author Andrew Selkirk
* @version 1.0
*/
public interface ComboBoxModel extends ListModel {
//-------------------------------------------------------------
// Methods ----------------------------------------------------
//-------------------------------------------------------------
/**
* setSelectedItem
* @param item TODO
*/
void setSelectedItem(Object item);
/**
* getSelectedItem
* @returns Object
*/
Object getSelectedItem();
public interface ComboBoxModel extends ListModel
{
/**
* This method sets the selected item in the combo box. Class
* implementing this interface should fire ListDataEvents to
* all registered ListDataListeners to indicated that the
* selection has changed.
*
* @param item item in the combo box that should be selected
*/
void setSelectedItem(Object item);
/**
* The method returns currently selected item in the combo box
*
* @returns item that is currently selected in the combo box.
*/
Object getSelectedItem();
} // ComboBoxModel
......@@ -38,146 +38,191 @@ exception statement from your version. */
package javax.swing;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Vector;
/**
* DefaultComboBoxModel
* @author Andrew Selkirk
* @version 1.0
* DefaultComboBoxModel is a data model for JComboBox. This model keeps track
* of elements contained in the JComboBox as well as the current combo box
* selection. Whenever selection in the JComboBox changes, the ComboBoxModel
* will fire ListDataEvents to ComboBox's ListDataListeners.
*
* @author Andrew Selkirk
* @author Olga Rodimina
* @version 1.0
*/
public class DefaultComboBoxModel extends AbstractListModel
implements MutableComboBoxModel, Serializable
public class DefaultComboBoxModel extends AbstractListModel
implements MutableComboBoxModel, Serializable
{
static final long serialVersionUID = 6698657703676921904L;
//-------------------------------------------------------------
// Variables --------------------------------------------------
//-------------------------------------------------------------
/**
* list
*/
private Vector list;
/**
* selectedItem
*/
private Object selectedItem;
//-------------------------------------------------------------
// Initialization ---------------------------------------------
//-------------------------------------------------------------
/**
* Constructor DefaultComboBoxModel
*/
public DefaultComboBoxModel() {
// TODO
} // DefaultComboBoxModel()
/**
* Constructor DefaultComboBoxModel
* @param items TODO
*/
public DefaultComboBoxModel(Object[] items) {
// TODO
} // DefaultComboBoxModel()
/**
* Constructor DefaultComboBoxModel
* @param vector TODO
*/
public DefaultComboBoxModel(Vector vector) {
// TODO
} // DefaultComboBoxModel()
//-------------------------------------------------------------
// Methods ----------------------------------------------------
//-------------------------------------------------------------
/**
* addElement
* @param object TODO
*/
public void addElement(Object object) {
// TODO
} // addElement()
/**
* removeElementAt
* @param index TODO
*/
public void removeElementAt(int index) {
// TODO
} // removeElementAt()
/**
* insertElementAt
* @param object TODO
* @param index TODO
*/
public void insertElementAt(Object object, int index) {
// TODO
} // insertElementAt()
/**
* removeElement
* @param object TODO
*/
public void removeElement(Object object) {
// TODO
} // removeElement()
/**
* removeAllElements
*/
public void removeAllElements() {
// TODO
} // removeAllElements()
/**
* getSize
* @returns int
*/
public int getSize() {
return 0; // TODO
} // getSize()
/**
* setSelectedItem
* @param object TODO
*/
public void setSelectedItem(Object object) {
// TODO
} // setSelectedItem()
/**
* getSelectedItem
* @returns Object
*/
public Object getSelectedItem() {
return null; // TODO
} // getSelectedItem()
/**
* getElementAt
* @param index TODO
* @returns Object
*/
public Object getElementAt(int index) {
return null; // TODO
} // getElementAt()
/**
* getIndexOf
* @param object TODO
* @returns int
*/
public int getIndexOf(Object object) {
return 0; // TODO
} // getIndexOf()
} // DefaultComboBoxModel
/**
* List containing items in the combo box
*/
private Vector list;
/**
* Currently selected item in the combo box list
*/
private Object selectedItem = null;
/**
* Constructor DefaultComboBoxModel. Create empty JComboBox.
*/
public DefaultComboBoxModel()
{
list = new Vector();
}
/**
* Constructs new DefaultComboBoxModel object and initializes its item list
* to values in the given array.
*
* @param items array containing items of the combo box.
*/
public DefaultComboBoxModel(Object[] items)
{
list = new Vector(Arrays.asList(items));
}
/**
* Consturcts new DefaultComboBoxModel object and initializes its item list
* to values in the given vector.
*
* @param vector Vector containing items for this combo box.
*/
public DefaultComboBoxModel(Vector vector)
{
this.list = vector;
}
/**
* This method adds element to the combo box list. It fires ListDataEvent
* indicating that component was added to the combo box to all of the
* JComboBox's registered ListDataListeners.
*
* @param object item to add to the combo box list
*/
public void addElement(Object object)
{
list.add(object);
fireIntervalAdded(this, list.size(), list.size());
}
/**
* This method removes element at the specified index from the combo box
* list. It fires ListDataEvent indicating that component was removed from
* the combo box list to all of the JComboBox's registered
* ListDataListeners.
*
* @param index index specifying location of the element to remove in the
* combo box list.
*/
public void removeElementAt(int index)
{
list.remove(index);
fireIntervalRemoved(this, index, index);
}
/**
* This method inserts given object to the combo box list at the specified
* index. It fires ListDataEvent indicating that component was inserted to
* the combo box list to all of the JComboBox's registered
* ListDataListeners.
*
* @param object element to insert
* @param index index specifing position in the list where given element
* should be inserted.
*/
public void insertElementAt(Object object, int index)
{
list.insertElementAt(object, index);
fireIntervalAdded(this, index, index);
}
/**
* Removes given object from the combo box list. It fires ListDataEvent
* indicating that component was removed from the combo box list to all of
* the JComboBox's registered ListDataListeners.
*
* @param object Element that will be removed from the combo box list
*/
public void removeElement(Object object)
{
int index = getIndexOf(object);
if (index != -1)
removeElementAt(index);
}
/**
* Removes all the items from the JComboBox's item list. It fires
* ListDataEvent indicating that all the elements were removed from the
* combo box list to all of the JComboBox's registered ListDataListeners.
*/
public void removeAllElements()
{
int listSize = getSize();
list.clear();
fireIntervalAdded(this, 0, listSize - 1);
}
/**
* Returns number of items in the combo box list
*
* @return number of items in the combo box list
*/
public int getSize()
{
return list.size();
}
/**
* Selects given object in the combo box list. This method fires
* ListDataEvent to all registered ListDataListeners of the JComboBox. The
* start and end index of the event is set to -1 to indicate combo box's
* selection has changed, and not its contents.
*
* @param object item to select in the JComboBox
*/
public void setSelectedItem(Object object)
{
selectedItem = object;
fireContentsChanged(this, -1, -1);
}
/**
* Returns currently selected item in the combo box list
*
* @return currently selected item in the combo box list
*/
public Object getSelectedItem()
{
return selectedItem;
}
/**
* Returns element in the combo box list located at the given index
*
* @param index specifying location of the element in the list
*
* @return return element in the combo box list located at the given index
*/
public Object getElementAt(int index)
{
return list.elementAt(index);
}
/**
* Returns index of the specified object in the combo box list.
*
* @param object element to look for in the combo box list .
*
* @return Index specifying position of the specified element in combo box
* list.
*/
public int getIndexOf(Object object)
{
return list.indexOf(object);
}
}
......@@ -41,16 +41,18 @@ import java.awt.Component;
import java.awt.Rectangle;
import java.io.Serializable;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
/**
* DefaultListCellRenderer
* DefaultListCellRenderer. This class is responsible for rendering list
* cells.
*
* @author Andrew Selkirk
* @version 1.0
*/
public class DefaultListCellRenderer
extends JLabel implements ListCellRenderer, Serializable
public class DefaultListCellRenderer extends JLabel implements ListCellRenderer,
Serializable
{
static final long serialVersionUID = 7708947179685189462L;
......@@ -62,19 +64,22 @@ public class DefaultListCellRenderer
}
}
/** noFocusBorder */
protected static Border noFocusBorder = null; // TODO
/**
* This border is used whenever renderer doesn't have a focus.
*/
protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
/**
* getListCellRendererComponent
*
* @param list TODO
* @param value TODO
* @param index TODO
* @param isSelected TODO
* @param cellHasFocus TODO
* @param list JList list for the 'value'
* @param value object that should be rendered in the cell
* @param index index of the cell
* @param isSelected draw cell highlighted if isSelected is true
* @param cellHasFocus draw focus rectangle around cell if the cell has
* focus
*
* @return Component
* @return Component that will be painted to the desired cell.
*/
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected,
......@@ -86,31 +91,87 @@ public class DefaultListCellRenderer
if (isSelected)
{
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else
{
setBackground(list.getBackground());
setForeground(list.getForeground());
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setEnabled(list.isEnabled());
setFont(list.getFont());
// Use focusCellHighlightBorder when renderer has focus and
// noFocusBorder otherwise
if (cellHasFocus)
setBorder(UIManager.getBorder("List.focusCellHighlightBorder"));
else
setBorder(noFocusBorder);
return this;
}
public void validate() {}
public void revalidate() {}
public void repaint(long tm, int x, int y, int w, int h) {}
public void repaint(Rectangle rect) {}
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue){}
public void firePropertyChange(String propertyName, byte oldValue, byte newValue) {}
public void firePropertyChange(String propertyName, char oldValue, char newValue) {}
public void firePropertyChange(String propertyName, short oldValue, short newValue) {}
public void firePropertyChange(String propertyName, int oldValue, int newValue) {}
public void firePropertyChange(String propertyName, long oldValue, long newValue) {}
public void firePropertyChange(String propertyName, float oldValue, float newValue) {}
public void firePropertyChange(String propertyName, double oldValue, double newValue) {}
public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
public void validate()
{
}
public void revalidate()
{
}
public void repaint(long tm, int x, int y, int w, int h)
{
}
public void repaint(Rectangle rect)
{
}
protected void firePropertyChange(String propertyName, Object oldValue,
Object newValue)
{
}
public void firePropertyChange(String propertyName, byte oldValue,
byte newValue)
{
}
public void firePropertyChange(String propertyName, char oldValue,
char newValue)
{
}
public void firePropertyChange(String propertyName, short oldValue,
short newValue)
{
}
public void firePropertyChange(String propertyName, int oldValue,
int newValue)
{
}
public void firePropertyChange(String propertyName, long oldValue,
long newValue)
{
}
public void firePropertyChange(String propertyName, float oldValue,
float newValue)
{
}
public void firePropertyChange(String propertyName, double oldValue,
double newValue)
{
}
public void firePropertyChange(String propertyName, boolean oldValue,
boolean newValue)
{
}
}
......@@ -264,7 +264,7 @@ public class DefaultListSelectionModel implements Cloneable,
{
end = i;
}
fireSelectionValueChanged(beg, end, valueIsAdjusting);
fireValueChanged(beg, end, valueIsAdjusting);
}
/**
......@@ -409,7 +409,7 @@ public class DefaultListSelectionModel implements Cloneable,
int hi = Math.max(index0, index1);
sel.set(lo, hi+1);
fireSelectionValueChanged(lo, hi, valueIsAdjusting);
fireValueChanged(lo, hi, valueIsAdjusting);
}
......@@ -429,7 +429,7 @@ public class DefaultListSelectionModel implements Cloneable,
int lo = Math.min(index0, index1);
int hi = Math.max(index0, index1);
sel.clear(lo, hi+1);
fireSelectionValueChanged(lo, hi, valueIsAdjusting);
fireValueChanged(lo, hi, valueIsAdjusting);
}
/**
......@@ -439,7 +439,7 @@ public class DefaultListSelectionModel implements Cloneable,
{
int sz = sel.size();
sel.clear();
fireSelectionValueChanged(0, sz, valueIsAdjusting);
fireValueChanged(0, sz, valueIsAdjusting);
}
/**
......@@ -460,7 +460,7 @@ public class DefaultListSelectionModel implements Cloneable,
int lo = Math.min(index0, index1);
int hi = Math.max(index0, index1);
sel.set(lo, hi+1);
fireSelectionValueChanged(lo, hi, valueIsAdjusting);
fireValueChanged(lo, hi, valueIsAdjusting);
}
/**
......@@ -522,8 +522,8 @@ public class DefaultListSelectionModel implements Cloneable,
* @param isAdjusting Whether this change is part of a seqence of adjustments
* made to the selection, such as during interactive scrolling
*/
public void fireSelectionValueChanged(int firstIndex, int lastIndex,
boolean isAdjusting)
protected void fireValueChanged(int firstIndex, int lastIndex,
boolean isAdjusting)
{
ListSelectionEvent evt = new ListSelectionEvent(this, firstIndex,
lastIndex, isAdjusting);
......
......@@ -89,9 +89,9 @@ public class InputMap
{
Object result = inputMap.get(keystroke);
if (result == null)
result = parent.get(keystroke);
return result;
if (result == null && parent != null)
result = parent.get(keystroke);
return result;
}
/**
......
......@@ -114,7 +114,7 @@ public class JCheckBox extends JToggleButton
}
/**
* Returns a string that specifies the name of the L&amp;F class
* Returns a string that specifies the name of the Look and Feel class
* that renders this component.
*/
public String getUIClassID()
......
......@@ -135,7 +135,7 @@ public class JFormattedTextField extends JTextField
public JFormattedTextField ()
{
throw new InternalError ("not implemented");
this((AbstractFormatterFactory) null);
}
public JFormattedTextField (Format format)
......@@ -150,7 +150,7 @@ public class JFormattedTextField extends JTextField
public JFormattedTextField (AbstractFormatterFactory factory)
{
throw new InternalError ("not implemented");
this(factory, null);
}
public JFormattedTextField (AbstractFormatterFactory factory, Object value)
......
......@@ -153,7 +153,7 @@ public class JLayeredPane extends JComponent implements Accessible
Map.Entry pair = (Map.Entry) i.next();
Integer layerNum = (Integer) pair.getKey ();
Integer layerSz = (Integer) pair.getValue ();
if (layerNum == layer)
if (layerNum.intValue() == layer.intValue())
{
ret[0] = ret[1] - layerSz.intValue ();
return ret;
......@@ -314,7 +314,7 @@ public class JLayeredPane extends JComponent implements Accessible
int bot = range[1];
if (position == -1)
position = (bot - top) - 1;
int targ = top + position;
int targ = Math.min(top + position, bot-1);
int curr = -1;
Component[] comps = getComponents();
......@@ -539,7 +539,8 @@ public class JLayeredPane extends JComponent implements Accessible
int layer,
int position)
{
componentToLayer.put (c, getObjectForLayer (layer));
remove(c);
add(c, getObjectForLayer (layer));
setPosition(c, position);
revalidate();
repaint();
......
......@@ -588,6 +588,28 @@ public class JList extends JComponent implements Accessible, Scrollable
return getUI().locationToIndex(this, r.getLocation());
}
/**
* Returns index of the cell to which specified location is closest to
* @param location for which to look for in the list
*
* @return index of the cell to which specified location is closest to.
*/
public int locationToIndex(Point location) {
return getUI().locationToIndex(this, location);
}
/**
* Returns location of the cell located at the specified index in the list.
* @param index of the cell for which location will be determined
*
* @return location of the cell located at the specified index in the list.
*/
public Point indexToLocation(int index){
//FIXME: Need to implement.
return null;
}
/**
* Returns the list index of the lower right or lower left corner of the
* {@link #visibleRect} property, depending on the {@link
......
......@@ -313,7 +313,8 @@ public class JMenuItem extends AbstractButton implements Accessible,
MenuSelectionManager manager)
{
// Fire MenuDragMouseEvents if mouse is being dragged.
boolean dragged = (event.getModifiers() & InputEvent.BUTTON1_MASK) != 0;
boolean dragged
= (event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0;
if (dragged)
processMenuDragMouseEvent(createMenuDragMouseEvent(event, path, manager));
......@@ -335,11 +336,11 @@ public class JMenuItem extends AbstractButton implements Accessible,
setArmed(false);
break;
case MouseEvent.MOUSE_PRESSED:
if ((event.getModifiers() & InputEvent.BUTTON1_MASK) != 0)
{
model.setArmed(true);
model.setPressed(true);
}
if ((event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) != 0)
{
model.setArmed(true);
model.setPressed(true);
}
break;
case MouseEvent.MOUSE_RELEASED:
break;
......@@ -589,6 +590,18 @@ public class JMenuItem extends AbstractButton implements Accessible,
}
/**
* Returns all added MenuDragMouseListener objects.
*
* @return an array of listeners
*
* @since 1.4
*/
public MenuDragMouseListener[] getMenuDragMouseListeners()
{
return (MenuDragMouseListener[]) listenerList.getListeners(MenuDragMouseListener.class);
}
/**
* Adds an MenuKeyListener to this menu item. This listener will be
* invoked when MenuKeyEvents will be fired by this menu item.
*
......@@ -610,6 +623,18 @@ public class JMenuItem extends AbstractButton implements Accessible,
}
/**
* Returns all added MenuKeyListener objects.
*
* @return an array of listeners
*
* @since 1.4
*/
public MenuKeyListener[] getMenuKeyListeners()
{
return (MenuKeyListener[]) listenerList.getListeners(MenuKeyListener.class);
}
/**
* A string that describes this JMenuItem. Normally only used
* for debugging.
*
......
......@@ -144,6 +144,9 @@ public class JPopupMenu extends JComponent implements Accessible, MenuElement
/* Location of the popup */
private Point popupLocation;
/* Field indicating if popup menu is visible or not */
private boolean visible = false;
/* Bound Property indicating visibility of the popup menu*/
public static final String VISIBLE_CHANGED_PROPERTY = "visible";
......@@ -564,7 +567,7 @@ public class JPopupMenu extends JComponent implements Accessible, MenuElement
*/
public boolean isVisible()
{
return super.isVisible();
return visible;
}
/**
......@@ -577,7 +580,7 @@ public class JPopupMenu extends JComponent implements Accessible, MenuElement
public void setVisible(boolean visible)
{
boolean old = isVisible();
super.setVisible(visible);
this.visible = visible;
if (old != isVisible())
{
firePropertyChange(VISIBLE_CHANGED_PROPERTY, old, (boolean) isVisible());
......@@ -615,7 +618,7 @@ public class JPopupMenu extends JComponent implements Accessible, MenuElement
.getLayeredPane();
Point p = new Point(popupLocation.x, popupLocation.y);
SwingUtilities.convertPointFromScreen(p, layeredPane);
popup.show(p.x, p.y, size.width, size.height);
popup.show(p.x, p.y, size.width, size.height);
}
else
{
......
......@@ -44,33 +44,47 @@ public class JRadioButton extends JToggleButton
{
private static final long serialVersionUID = 7751949583255506856L;
public JRadioButton()
{
this(null, null);
}
public JRadioButton(Action a)
{
this();
setAction(a);
}
public JRadioButton(Icon icon)
{
this(null, icon);
}
public JRadioButton()
{
this(null, null);
}
public JRadioButton(Action a)
{
this();
setAction(a);
}
public JRadioButton(Icon icon)
{
this(null, icon);
}
public JRadioButton(String text)
{
this(text, null);
}
public JRadioButton(Icon icon, boolean selected)
{
this(null, icon, selected);
}
public JRadioButton(String text)
{
this(text, null);
}
public JRadioButton(String text, boolean selected)
{
this(text, null, selected);
}
public JRadioButton(String text, Icon icon)
{
super(text, icon);
borderPainted = false;
contentAreaFilled = false;
}
public JRadioButton(String text, Icon icon)
{
super(text, icon);
borderPainted = false;
contentAreaFilled = false;
}
public JRadioButton(String text, Icon icon, boolean selected)
{
}
public AccessibleContext getAccessibleContext()
{
......
......@@ -41,7 +41,6 @@ package javax.swing;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Point;
......@@ -510,7 +509,8 @@ public class JScrollPane
else
{
// otherwise we got a change update from either the VSB or
// HSB model, and we need to update the viewport position to
// HSB model, and we need to update the viewport positions of
// both the main viewport and any row or column headers to
// match.
int xpos = 0;
......@@ -527,6 +527,20 @@ public class JScrollPane
if (vp != null
&& vp.getViewPosition() != pt)
vp.setViewPosition(pt);
pt.x = 0;
if (rowHeader != null
&& rowHeader.getViewPosition() != pt)
rowHeader.setViewPosition(pt);
pt.x = xpos;
pt.y = 0;
if (columnHeader != null
&& columnHeader.getViewPosition() != pt)
columnHeader.setViewPosition(pt);
}
}
};
......
......@@ -137,9 +137,15 @@ public class JTextField extends JTextComponent
*/
public JTextField(Document doc, String text, int columns)
{
if (columns < 0)
throw new IllegalArgumentException();
this.columns = columns;
setDocument(doc == null ? createDefaultModel() : doc);
setText(text);
setColumns(columns);
if (text != null)
setText(text);
}
/**
......
/* JToolTip.java --
/* JToolTip.java --
Copyright (C) 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
......@@ -35,25 +35,160 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package javax.swing;
import java.awt.AWTEvent;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.swing.plaf.ToolTipUI;
/**
* This class is used to display ToolTips. ToolTips are small floating windows
* that display text when the mouse comes to rest over a Component. ToolTips
* are set for JComponents using JComponent.setToolTipText(String).
*/
public class JToolTip extends JComponent implements Accessible
{
/** DOCUMENT ME! */
private static final long serialVersionUID = -1138929898906751643L;
/**
* DOCUMENT ME!
*/
protected class AccessibleJToolTip extends AccessibleJComponent
{
/**
* Creates a new AccessibleJToolTip object.
*/
protected AccessibleJToolTip()
{
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getAccessibleDescription()
{
return null;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public AccessibleRole getAccessibleRole()
{
return null;
}
}
/** The text to display in the JToolTip. */
String text;
/** The JComponent this JToolTip is used for. */
JComponent component;
/**
* Creates a new JToolTip object.
*/
public JToolTip()
{
disableEvents(AWTEvent.MOUSE_EVENT_MASK);
updateUI();
}
public void setTipText(String newText)
/**
* This method returns the text this JToolTip displays.
*
* @return The text that this JToolTip displays.
*/
public String getTipText()
{
this.text = newText;
return text;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public AccessibleContext getAccessibleContext()
{
return null;
}
}
/**
* This method returns the JComponent this JToolTip displays for.
*
* @return The JComponent this JToolTip displays for.
*/
public JComponent getComponent()
{
return component;
}
/**
* This method returns the UI responsible for displaying this JToolTip.
*
* @return The UI responsible for displaying this JToolTip.
*/
public ToolTipUI getUI()
{
return (ToolTipUI) ui;
}
/**
* This method returns the String identifier for the UI class.
*
* @return The String identifier for the UI class.
*/
public String getUIClassID()
{
return "ToolTipUI";
}
/**
* This method returns a debugging String describing the JToolTip.
*
* @return A debugging String describing the JToolTip.
*/
protected String paramString()
{
return "JToolTip";
}
/**
* This method sets the JComponent that the JToolTip displays for.
*
* @param c The JComponent that the JToolTip displays for.
*/
public void setComponent(JComponent c)
{
component = c;
}
/**
* This method sets the text that the JToolTip displays.
*
* @param tipText The text that the JToolTip displays.
*/
public void setTipText(String tipText)
{
text = tipText;
}
/**
* This method resets the UI used to the Look and Feel default.
*/
public void updateUI()
{
setUI((ToolTipUI) UIManager.getUI(this));
revalidate();
repaint();
}
}
......@@ -249,8 +249,13 @@ public class JViewport extends JComponent
public void setView(Component v)
{
add(v);
fireStateChanged();
while (getComponentCount() > 0)
remove(0);
if (v != null)
{
add(v);
fireStateChanged();
}
}
public void revalidate()
......
......@@ -37,235 +37,69 @@ exception statement from your version. */
package javax.swing;
import java.awt.AWTKeyStroke;
import java.awt.event.KeyEvent;
import java.io.Serializable;
/**
* KeyStroke
* @author Andrew Selkirk
* @version 1.0
*/
public class KeyStroke implements Serializable
public class KeyStroke
extends AWTKeyStroke
implements Serializable
{
static final long serialVersionUID = -9060180771037902530L;
//-------------------------------------------------------------
// Variables --------------------------------------------------
//-------------------------------------------------------------
/**
* keyChar
*/
private char keyChar = 0;
/**
* keyCode
*/
private int keyCode = 0;
/**
* modifiers
*/
private int modifiers = 0;
/**
* onKeyRelease
*/
private boolean onKeyRelease = false;
//-------------------------------------------------------------
// Initialization ---------------------------------------------
//-------------------------------------------------------------
/**
* Constructor KeyStroke
*/
private KeyStroke() {
} // KeyStroke()
//-------------------------------------------------------------
// Methods ----------------------------------------------------
//-------------------------------------------------------------
/**
* hashCode
* @returns int
*/
public int hashCode() {
return 0; // TODO
} // hashCode()
/**
* equals
* @param object TODO
* @returns boolean
*/
public boolean equals(Object object) {
// Variables
KeyStroke key;
if (object instanceof KeyStroke) {
key = (KeyStroke) object;
if (key.keyChar == keyChar &&
key.keyCode == keyCode &&
key.modifiers == modifiers &&
key.onKeyRelease == onKeyRelease) {
return true;
} // if
} // if
return false;
} // equals()
/**
* toString
* @returns String
*/
public String toString() {
return null; // TODO
} // toString()
/**
* getKeyStroke
* @param keyChar TODO
* @returns KeyStroke
*/
public static KeyStroke getKeyStroke(char keyChar) {
// Variables
KeyStroke key;
key = new KeyStroke();
key.keyChar = keyChar;
return key;
} // getKeyStroke()
/**
* getKeyStroke - deprecated
* @param keyChar TODO
* @param onKeyRelease TODO
* @returns KeyStroke
* @deprecated Use getKeyStroke(char)
*/
public static KeyStroke getKeyStroke(char keyChar, boolean onKeyRelease) {
KeyStroke key = getKeyStroke(keyChar);
key.onKeyRelease = onKeyRelease;
return key;
} // getKeyStroke()
/**
* getKeyStroke
* @param keyChar TODO
* @param modifiers TODO
* @returns KeyStroke
*/
public static KeyStroke getKeyStroke(Character keyChar, int modifiers) {
KeyStroke key = getKeyStroke(keyChar.charValue());
key.modifiers = modifiers;
return key;
} // getKeyStroke()
/**
* getKeyStroke
* @param keyCode TODO
* @param modifiers TODO
* @param onKeyRelease TODO
* @returns KeyStroke
*/
public static KeyStroke getKeyStroke(int keyCode, int modifiers,
boolean onKeyRelease) {
// Variables
KeyStroke key;
key = new KeyStroke();
key.keyCode = keyCode;
key.modifiers = modifiers;
key.onKeyRelease = onKeyRelease;
return key;
} // getKeyStroke()
/**
* getKeyStroke
* @param keyCode TODO
* @param modifiers TODO
* @returns KeyStroke
*/
public static KeyStroke getKeyStroke(int keyCode, int modifiers) {
return getKeyStroke(keyCode, modifiers, false);
} // getKeyStroke()
/**
* getKeyStroke
* @param string TODO
* @returns KeyStroke
*/
public static KeyStroke getKeyStroke(String string) {
return null; // TODO
} // getKeyStroke()
/**
* getKeyStrokeForEvent
* @param event TODO
* @returns KeyStroke
*/
public static KeyStroke getKeyStrokeForEvent(KeyEvent event) {
// Variables
int eventID;
int eventMod;
// Get Event ID
eventID = event.getID();
eventMod = event.getModifiers();
// Check for KEY_TYPED event
if (eventID == KeyEvent.KEY_TYPED) {
return getKeyStroke(event.getKeyChar(), eventMod);
// KEY_PRESSED or KEY_RELEASED event
} else {
return getKeyStroke(event.getKeyCode(), eventMod);
} // if
} // getKeyStrokeForEvent()
/**
* getKeyChar
* @returns char
*/
public char getKeyChar() {
return keyChar;
} // getKeyChar()
/**
* getKeyCode
* @returns int
*/
public int getKeyCode() {
return keyCode;
} // getKeyCode()
/**
* getModifiers
* @returns int
*/
public int getModifiers() {
return modifiers; // TODO
} // getModifiers()
/**
* isOnKeyRelease
* @returns boolean
*/
public boolean isOnKeyRelease() {
return onKeyRelease;
} // isOnKeyRelease()
} // KeyStroke
private KeyStroke() {
}
protected KeyStroke(char keyChar, int keyCode, int modifiers,
boolean onKeyRelease)
{
super(keyChar, keyCode, modifiers, onKeyRelease);
}
static
{
AWTKeyStroke.registerSubclass(KeyStroke.class);
}
public static KeyStroke getKeyStroke(char keyChar)
{
return (KeyStroke) getAWTKeyStroke(keyChar);
}
/**
* @deprecated Use {@link #getKeyStroke(char)}
*
* This method, unlike all the other factory methods on this object,
* returns a non-cached, non-shared object. New code should not use it.
*/
public static KeyStroke getKeyStroke(char keyChar, boolean onKeyRelease)
{
return new KeyStroke(keyChar, KeyEvent.VK_UNDEFINED, 0, onKeyRelease);
}
public static KeyStroke getKeyStroke(Character keyChar, int modifiers)
{
return (KeyStroke) getAWTKeyStroke(keyChar, modifiers);
}
public static KeyStroke getKeyStroke(int keyCode, int modifiers,
boolean onKeyRelease)
{
return (KeyStroke) getAWTKeyStroke(keyCode, modifiers, onKeyRelease);
}
public static KeyStroke getKeyStroke(int keyCode, int modifiers)
{
return (KeyStroke) getAWTKeyStroke(keyCode, modifiers);
}
public static KeyStroke getKeyStroke(String str)
{
return (KeyStroke) getAWTKeyStroke(str);
}
public static KeyStroke getKeyStrokeForEvent(KeyEvent event)
{
return (KeyStroke) getAWTKeyStrokeForEvent(event);
}
}
......@@ -38,40 +38,46 @@ exception statement from your version. */
package javax.swing;
/**
* MutableComboBoxModel
* @author Andrew Selkirk
* @version 1.0
* MutableComboBoxModel is interface for data model that keeps track of the
* components data and provides methods to insert and remove elements from
* it. The Classes implementing this interface should fire appropriate
* events indicating the undergoing change in the data model.
*
* @author Andrew Selkirk
* @author Olga Rodimina
* @version 1.0
*/
public interface MutableComboBoxModel extends ComboBoxModel {
public interface MutableComboBoxModel extends ComboBoxModel
{
/**
* This method adds given object to its data model.
*
* @param object element to add to the data model.
*/
void addElement(Object object);
//-------------------------------------------------------------
// Methods ----------------------------------------------------
//-------------------------------------------------------------
/**
* addElement
* @param object TODO
*/
void addElement(Object object);
/**
* removeElementAt
* @param index TODO
*/
void removeElementAt(int index);
/**
* insertElementAt
* @param object TODO
* @param index TODO
*/
void insertElementAt(Object object, int index);
/**
* removeElement
* @param object TODO
*/
void removeElement(Object object);
/**
* This method removes elements located at the given index in the data
* model.
*
* @param index index specifying location of the element to remove.
*/
void removeElementAt(int index);
/**
* This method inserts givent element to the data model, at the specified
* index.
*
* @param object element to insert
* @param index index specifying the position in the data model where the
* given element should be inserted.
*/
void insertElementAt(Object object, int index);
/**
* This method removes given element from the data model
*
* @param element to remove.
*/
void removeElement(Object object);
} // MutableComboBoxModel
......@@ -431,6 +431,9 @@ public class RepaintManager
if (damaged.width == 0 || damaged.height == 0)
continue;
JRootPane root = comp.getRootPane();
// If the component has no root, no repainting will occur.
if (root == null)
continue;
Rectangle rootDamage = SwingUtilities.convertRectangle(comp, damaged, root);
if (! roots.containsKey(root))
{
......@@ -450,7 +453,7 @@ public class RepaintManager
Map.Entry ent = (Map.Entry) i.next();
JRootPane root = (JRootPane) ent.getKey();
Rectangle rect = (Rectangle) ent.getValue();
root.paintImmediately(rect);
root.paintImmediately(rect);
}
}
......
......@@ -82,6 +82,8 @@ public class ScrollPaneLayout
public void syncWithScrollPane(JScrollPane scrollPane) {
viewport = scrollPane.getViewport();
rowHead = scrollPane.getRowHeader();
colHead = scrollPane.getColumnHeader();
vsb = scrollPane.getVerticalScrollBar();
hsb = scrollPane.getHorizontalScrollBar();
vsbPolicy = scrollPane.getVerticalScrollBarPolicy();
......@@ -389,12 +391,12 @@ public class ScrollPaneLayout
y4 = scrollPaneBounds.y + scrollPaneBounds.height;
if (colHead != null)
y2 = colHead.getPreferredSize().height;
y2 = y1 + colHead.getPreferredSize().height;
else
y2 = y1;
if (rowHead != null)
x2 = rowHead.getPreferredSize().width;
x2 = x1 + rowHead.getPreferredSize().width;
else
x2 = x1;
......
......@@ -51,9 +51,13 @@ import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.lang.reflect.InvocationTargetException;
import javax.swing.plaf.ActionMapUIResource;
import javax.swing.plaf.InputMapUIResource;
/**
......@@ -441,7 +445,7 @@ public class SwingUtilities implements SwingConstants
destination);
return new MouseEvent(destination, sourceEvent.getID(),
sourceEvent.getWhen(), sourceEvent.getModifiers(),
sourceEvent.getWhen(), sourceEvent.getModifiersEx(),
newpt.x, newpt.y, sourceEvent.getClickCount(),
sourceEvent.isPopupTrigger(), sourceEvent.getButton());
}
......@@ -863,7 +867,7 @@ public class SwingUtilities implements SwingConstants
*/
public static boolean isLeftMouseButton(MouseEvent event)
{
return ((event.getModifiers() & InputEvent.BUTTON1_DOWN_MASK)
return ((event.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK)
== InputEvent.BUTTON1_DOWN_MASK);
}
......@@ -876,7 +880,7 @@ public class SwingUtilities implements SwingConstants
*/
public static boolean isMiddleMouseButton(MouseEvent event)
{
return ((event.getModifiers() & InputEvent.BUTTON2_DOWN_MASK)
return ((event.getModifiersEx() & InputEvent.BUTTON2_DOWN_MASK)
== InputEvent.BUTTON2_DOWN_MASK);
}
......@@ -889,7 +893,7 @@ public class SwingUtilities implements SwingConstants
*/
public static boolean isRightMouseButton(MouseEvent event)
{
return ((event.getModifiers() & InputEvent.BUTTON3_DOWN_MASK)
return ((event.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK)
== InputEvent.BUTTON3_DOWN_MASK);
}
......@@ -911,4 +915,103 @@ public class SwingUtilities implements SwingConstants
return true;
}
}
public static boolean notifyAction(Action action,
KeyStroke ks,
KeyEvent event,
Object sender,
int modifiers)
{
if (action != null && action.isEnabled())
{
String name = (String) action.getValue(Action.ACTION_COMMAND_KEY);
if (name == null
&& event.getKeyChar() != KeyEvent.CHAR_UNDEFINED)
name = new String(new char[] {event.getKeyChar()});
action.actionPerformed(new ActionEvent(sender,
ActionEvent.ACTION_PERFORMED,
name, modifiers));
return true;
}
return false;
}
/**
* <p>Change the shared, UI-managed {@link ActionMap} for a given
* component. ActionMaps are arranged in a hierarchy, in order to
* encourage sharing of common actions between components. The hierarchy
* unfortunately places UI-managed ActionMaps at the <em>end</em> of the
* parent-pointer chain, as illustrated:</p>
*
* <pre>
* [{@link javax.swing.JComponent#getActionMap()}]
* --&gt; [{@link javax.swing.ActionMap}]
* parent --&gt; [{@link javax.swing.text.KeymapActionMap}]
* parent --&gt; [{@link javax.swing.plaf.ActionMapUIResource}]
* </pre>
*
* <p>Our goal with this method is to replace the first ActionMap along
* this chain which is an instance of {@link ActionMapUIResource}, since
* these are the ActionMaps which are supposed to be shared between
* components.</p>
*
* <p>If the provided ActionMap is <code>null</code>, we interpret the
* call as a request to remove the UI-managed ActionMap from the
* component's ActionMap parent chain.</p>
*/
public static void replaceUIActionMap(JComponent component,
ActionMap uiActionMap)
{
ActionMap child = component.getActionMap();
if (child == null)
component.setActionMap(uiActionMap);
else
{
while(child.getParent() != null
&& !(child.getParent() instanceof ActionMapUIResource))
child = child.getParent();
if (child != null)
child.setParent(uiActionMap);
}
}
/**
* <p>Change the shared, UI-managed {@link InputMap} for a given
* component. InputMaps are arranged in a hierarchy, in order to
* encourage sharing of common input mappings between components. The
* hierarchy unfortunately places UI-managed InputMaps at the
* <em>end</em> of the parent-pointer chain, as illustrated:</p>
*
* <pre>
* [{@link javax.swing.JComponent#getInputMap()}]
* --&gt; [{@link javax.swing.InputMap}]
* parent --&gt; [{@link javax.swing.text.KeymapWrapper}]
* parent --&gt; [{@link javax.swing.plaf.InputMapUIResource}]
* </pre>
*
* <p>Our goal with this method is to replace the first InputMap along
* this chain which is an instance of {@link InputMapUIResource}, since
* these are the InputMaps which are supposed to be shared between
* components.</p>
*
* <p>If the provided InputMap is <code>null</code>, we interpret the
* call as a request to remove the UI-managed InputMap from the
* component's InputMap parent chain.</p>
*/
public static void replaceUIInputMap(JComponent component,
int condition,
InputMap uiInputMap)
{
InputMap child = component.getInputMap(condition);
if (child == null)
component.setInputMap(condition, uiInputMap);
else
{
while(child.getParent() != null
&& !(child.getParent() instanceof InputMapUIResource))
child = child.getParent();
if (child != null)
child.setParent(uiInputMap);
}
}
}
/* Timer.java --
/* Timer.java --
Copyright (C) 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
......@@ -35,22 +35,26 @@ this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package javax.swing;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.EventListener;
import javax.swing.event.EventListenerList;
/**
* DOCUMENT ME!
*/
public class Timer implements Serializable
{
/** DOCUMENT ME! */
private static final long serialVersionUID = -1116180831621385484L;
/** DOCUMENT ME! */
protected EventListenerList listenerList = new EventListenerList();
// This object manages a "queue" of virtual actionEvents, maintained as a
// simple long counter. When the timer expires, a new event is queued,
// and a dispatcher object is pushed into the system event queue. When
......@@ -58,79 +62,127 @@ public class Timer implements Serializable
// ActionEvents as have been queued, unless the timer is set to
// coalescing mode, in which case it will fire only one ActionEvent.
/** DOCUMENT ME! */
private long queue;
/** DOCUMENT ME! */
private Object queueLock = new Object();
/** DOCUMENT ME! */
private Waker waker;
/**
* DOCUMENT ME!
*/
private void queueEvent()
{
synchronized (queueLock)
{
queue++;
if (queue == 1)
SwingUtilities.invokeLater(new Runnable() { public void run() { drainEvents(); } });
queue++;
if (queue == 1)
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
drainEvents();
}
});
}
}
/**
* DOCUMENT ME!
*/
private void drainEvents()
{
synchronized (queueLock)
{
if (isCoalesce())
{
if (queue > 0)
fireActionPerformed();
}
else
{
while(queue > 0)
{
fireActionPerformed();
queue--;
}
}
queue = 0;
if (isCoalesce())
{
if (queue > 0)
fireActionPerformed();
}
else
{
while (queue > 0)
{
fireActionPerformed();
queue--;
}
}
queue = 0;
}
}
static boolean logTimers;
/** DOCUMENT ME! */
boolean coalesce = true;
/** DOCUMENT ME! */
boolean repeats = true;
/** DOCUMENT ME! */
boolean running;
/** DOCUMENT ME! */
int ticks;
/** DOCUMENT ME! */
int delay;
/** DOCUMENT ME! */
int initialDelay;
private class Waker
extends Thread
/**
* DOCUMENT ME!
*/
private class Waker extends Thread
{
/**
* DOCUMENT ME!
*/
public void run()
{
running = true;
try
try
{
sleep(initialDelay);
while (running)
{
sleep(delay);
queueEvent();
if (logTimers)
System.out.println("javax.swing.Timer -> clocktick");
if (! repeats)
break;
}
running = false;
}
catch (Exception e)
sleep(initialDelay);
while (running)
{
try
{
sleep(delay);
}
catch (InterruptedException e)
{
return;
}
queueEvent();
if (logTimers)
System.out.println("javax.swing.Timer -> clocktick");
if (! repeats)
break;
}
running = false;
}
catch (Exception e)
{
System.out.println("swing.Timer::" + e);
// System.out.println("swing.Timer::" + e);
}
}
}
/**
* Creates a new Timer object.
*
* @param d DOCUMENT ME!
* @param listener DOCUMENT ME!
*/
public Timer(int d, ActionListener listener)
{
delay = d;
......@@ -139,123 +191,214 @@ public class Timer implements Serializable
addActionListener(listener);
}
/**
* DOCUMENT ME!
*
* @param c DOCUMENT ME!
*/
public void setCoalesce(boolean c)
{
coalesce = c;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isCoalesce()
{
return coalesce;
}
/**
* DOCUMENT ME!
*
* @param listener DOCUMENT ME!
*/
public void addActionListener(ActionListener listener)
{
listenerList.add (ActionListener.class, listener);
listenerList.add(ActionListener.class, listener);
}
/**
* DOCUMENT ME!
*
* @param listener DOCUMENT ME!
*/
public void removeActionListener(ActionListener listener)
{
listenerList.remove (ActionListener.class, listener);
listenerList.remove(ActionListener.class, listener);
}
/**
* DOCUMENT ME!
*
* @param listenerType DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @since 1.3
*/
public EventListener[] getListeners (Class listenerType)
public EventListener[] getListeners(Class listenerType)
{
return listenerList.getListeners (listenerType);
return listenerList.getListeners(listenerType);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @since 1.4
*/
public ActionListener[] getActionListeners ()
public ActionListener[] getActionListeners()
{
return (ActionListener[]) listenerList.getListeners (ActionListener.class);
return (ActionListener[]) listenerList.getListeners(ActionListener.class);
}
protected void fireActionPerformed (ActionEvent event)
/**
* DOCUMENT ME!
*
* @param event DOCUMENT ME!
*/
protected void fireActionPerformed(ActionEvent event)
{
ActionListener[] listeners = getActionListeners();
for (int i = 0; i < listeners.length; i++)
{
listeners [i].actionPerformed (event);
}
listeners[i].actionPerformed(event);
}
void fireActionPerformed ()
/**
* DOCUMENT ME!
*/
void fireActionPerformed()
{
fireActionPerformed (new ActionEvent (this, ticks++, "Timer"));
fireActionPerformed(new ActionEvent(this, ticks++, "Timer"));
}
/**
* DOCUMENT ME!
*
* @param lt DOCUMENT ME!
*/
public static void setLogTimers(boolean lt)
{
logTimers = lt;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static boolean getLogTimers()
{
return logTimers;
}
/**
* DOCUMENT ME!
*
* @param d DOCUMENT ME!
*/
public void setDelay(int d)
{
delay = d;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public int getDelay()
{
return delay;
}
/**
* DOCUMENT ME!
*
* @param i DOCUMENT ME!
*/
public void setInitialDelay(int i)
{
initialDelay = i;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public int getInitialDelay()
{
return initialDelay;
}
/**
* DOCUMENT ME!
*
* @param r DOCUMENT ME!
*/
public void setRepeats(boolean r)
{
repeats = r;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isRepeats()
{
return repeats;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public boolean isRunning()
{
return running;
}
/**
* DOCUMENT ME!
*/
public void start()
{
if (isRunning())
{
System.err.println("attempt to start a running timer");
return;
}
new Waker().start();
return;
waker = new Waker();
waker.start();
}
/**
* DOCUMENT ME!
*/
public void restart()
{
synchronized (queueLock)
{
queue = 0;
}
stop();
start();
}
/**
* DOCUMENT ME!
*/
public void stop()
{
running = false;
if (waker != null)
waker.interrupt();
synchronized (queueLock)
{
queue = 0;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment