PatchSet 6632 Date: 2005/06/11 21:37:10 Author: robilad Branch: HEAD Tag: (none) Log: Resynced with GNU Classpath: awt and swing fixes
Members: ChangeLog:1.4158->1.4159 libraries/clib/awt/classpath-gtk/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c:1.3->1.4 libraries/javalib/javax/swing/JFrame.java:1.6->1.7 libraries/javalib/javax/swing/JLabel.java:1.8->1.9 libraries/javalib/javax/swing/JTree.java:1.16->1.17 libraries/javalib/javax/swing/plaf/basic/BasicButtonListener.java:1.7->1.8 libraries/javalib/javax/swing/plaf/basic/BasicTextUI.java:1.13->1.14 libraries/javalib/javax/swing/text/DefaultFormatter.java:INITIAL->1.1 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.4158 kaffe/ChangeLog:1.4159 --- kaffe/ChangeLog:1.4158 Sat Jun 11 21:25:20 2005 +++ kaffe/ChangeLog Sat Jun 11 21:37:10 2005 @@ -1,6 +1,60 @@ 2005-06-11 Dalibor Topic <[EMAIL PROTECTED]> Resynced with GNU Classpath. + + 2005-06-06 Sven de Marothy <[EMAIL PROTECTED]> + + * javax/swing/JLabel.java + (JLabel): Horizontal justification changed to default to LEADING. + + 2005-06-06 Roman Kennke <[EMAIL PROTECTED]> + + * javax/swing/text/DefaultFormatter.java: + Implemented new class. + + 2005-06-06 Roman Kennke <[EMAIL PROTECTED]> + + * javax/swing/JFrame.java: + Added the two missing constructors that take + java.awt.GraphicsConfiguration objects as arguments. + + 2005-06-06 Roman Kennke <[EMAIL PROTECTED]> + + * javax/swing/JTree.java + (removeDescendantSelectedPaths): Implemented new method. + + 2005-06-06 Roman Kennke <[EMAIL PROTECTED]> + + * javax/swing/plaf/basic/BasicButtonListener.java + (focusLost): Don't unarm button on focus lost. This behaviour is + not documented anywhere and disturbs correct event processing + in buttons. + + 2005-06-06 Roman Kennke <[EMAIL PROTECTED]> + + * javax/swing/plaf/basic/BasicTextUI.java + (getKeymapName): Removed debug statement. + + 2005-06-06 Roman Kennke <[EMAIL PROTECTED]> + + * javax/swing/plaf/basic/BasicTextUI.java + (getKeymapName): Added API documentation comments. + + 2005-06-06 Roman Kennke <[EMAIL PROTECTED]> + + * javax/swing/plaf/basic/BasicTextUI.java + (getKeymapName): Reimplemented to return the classname of + itself. This way subclasses don't have to override this + method. + + 2005-06-06 Sven de Marothy <[EMAIL PROTECTED]> + + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c + (gtkWidgetSetForeground): Avoid setting black-on-black selection color + +2005-06-11 Dalibor Topic <[EMAIL PROTECTED]> + + Resynced with GNU Classpath. 2005-06-05 Tom Tromey <[EMAIL PROTECTED]> Index: kaffe/libraries/clib/awt/classpath-gtk/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c diff -u kaffe/libraries/clib/awt/classpath-gtk/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c:1.3 kaffe/libraries/clib/awt/classpath-gtk/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c:1.4 --- kaffe/libraries/clib/awt/classpath-gtk/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c:1.3 Mon Sep 27 17:40:59 2004 +++ kaffe/libraries/clib/awt/classpath-gtk/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c Sat Jun 11 21:37:12 2005 @@ -39,6 +39,12 @@ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkTextFieldPeer.h" +/* the color used for highlighting when the foreground is black, + since black highlights aren't a Good Idea. */ +#define BB_RED 16962 +#define BB_GREEN 26985 +#define BB_BLUE 31611 + static jint get_border_width (GtkWidget *entry); @@ -94,10 +100,17 @@ color.red = (red / 255.0) * 65535; color.green = (green / 255.0) * 65535; color.blue = (blue / 255.0) * 65535; - + gdk_threads_enter (); gtk_widget_modify_text (GTK_WIDGET (ptr), GTK_STATE_NORMAL, &color); + + if ( red == 0 && green == 0 && blue == 0) + { + color.red = BB_RED; + color.green = BB_GREEN; + color.blue = BB_BLUE; + } gtk_widget_modify_base (GTK_WIDGET (ptr), GTK_STATE_SELECTED, &color); gdk_threads_leave (); Index: kaffe/libraries/javalib/javax/swing/JFrame.java diff -u kaffe/libraries/javalib/javax/swing/JFrame.java:1.6 kaffe/libraries/javalib/javax/swing/JFrame.java:1.7 --- kaffe/libraries/javalib/javax/swing/JFrame.java:1.6 Wed Jan 26 13:40:05 2005 +++ kaffe/libraries/javalib/javax/swing/JFrame.java Sat Jun 11 21:37:12 2005 @@ -45,6 +45,7 @@ import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; +import java.awt.GraphicsConfiguration; import java.awt.LayoutManager; import java.awt.event.KeyEvent; import java.awt.event.WindowEvent; @@ -76,6 +77,37 @@ public JFrame(String title) { super(title); + frameInit(); + } + + /** + * Creates a new JFrame in the specified [EMAIL PROTECTED] GraphicsConfiguration} + * and with an empty title. + * + * @param gc the <code>GraphicsConfiguration</code> that is used for + * the new <code>JFrame</code> + * + * @see Frame(GraphicsConfiguration) + */ + public JFrame(GraphicsConfiguration gc) + { + super(gc); + frameInit(); + } + + /** + * Creates a new JFrame in the specified [EMAIL PROTECTED] GraphicsConfiguration} + * and with the specified title. + * + * @param title the title for the new <code>JFrame</code> + * @param gc the <code>GraphicsConfiguration</code> that is used for + * the new <code>JFrame</code> + * + * @see Frame(String, GraphicsConfiguration) + */ + public JFrame(String title, GraphicsConfiguration gc) + { + super(title, gc); frameInit(); } Index: kaffe/libraries/javalib/javax/swing/JLabel.java diff -u kaffe/libraries/javalib/javax/swing/JLabel.java:1.8 kaffe/libraries/javalib/javax/swing/JLabel.java:1.9 --- kaffe/libraries/javalib/javax/swing/JLabel.java:1.8 Thu Jan 27 14:07:11 2005 +++ kaffe/libraries/javalib/javax/swing/JLabel.java Sat Jun 11 21:37:12 2005 @@ -92,23 +92,23 @@ private transient int iconTextGap = 4; /** - * Creates a new horizontally and vertically centered JLabel object with no - * text and no icon. + * Creates a new vertically centered, horizontally on the leading edge + * JLabel object with text and no icon. */ public JLabel() { - this(null, null, CENTER); + this(null, null, LEADING); } /** - * Creates a new horizontally and vertically centered JLabel object with no - * text and the given icon. + * Creates a new vertically centered, horizontally on the leading edge + * JLabel object with no text and the given icon. * * @param image The icon to use with the label. */ public JLabel(Icon image) { - this(null, image, CENTER); + this(null, image, LEADING); } /** @@ -125,14 +125,14 @@ } /** - * Creates a new horizontally and vertically centered JLabel object with no - * icon and the given text. + * Creates a new horizontally leading and vertically centered JLabel + * object with no icon and the given text. * * @param text The text to use with the label. */ public JLabel(String text) { - this(text, null, CENTER); + this(text, null, LEADING); } /** Index: kaffe/libraries/javalib/javax/swing/JTree.java diff -u kaffe/libraries/javalib/javax/swing/JTree.java:1.16 kaffe/libraries/javalib/javax/swing/JTree.java:1.17 --- kaffe/libraries/javalib/javax/swing/JTree.java:1.16 Fri Jun 10 19:51:08 2005 +++ kaffe/libraries/javalib/javax/swing/JTree.java Sat Jun 11 21:37:12 2005 @@ -1780,4 +1780,37 @@ } return foundPath; } + + /** + * Removes any paths in the current set of selected paths that are + * descendants of <code>path</code>. If <code>includePath</code> is + * set to <code>true</code> and <code>path</code> itself is selected, + * then it will be removed too. + * + * @param path the path from which selected descendants are to be + * removed + * @param includePath if <code>true</code> then <code>path</code> + * itself will also be remove if it's selected + * + * @return <code>true</code> if something has been removed, + * <code>false</code> otherwise + * + * @since 1.3 + */ + protected boolean removeDescendantSelectedPaths(TreePath path, + boolean includeSelected) + { + boolean removedSomething = false; + TreePath[] selected = getSelectionPaths(); + for (int index = 0; index < selected.length; index++) + { + if ((selected[index] == path && includeSelected) + || (selected[index].isDescendant(path))) + { + removeSelectionPath(selected[index]); + removedSomething = true; + } + } + return removedSomething; + } } Index: kaffe/libraries/javalib/javax/swing/plaf/basic/BasicButtonListener.java diff -u kaffe/libraries/javalib/javax/swing/plaf/basic/BasicButtonListener.java:1.7 kaffe/libraries/javalib/javax/swing/plaf/basic/BasicButtonListener.java:1.8 --- kaffe/libraries/javalib/javax/swing/plaf/basic/BasicButtonListener.java:1.7 Sun May 15 10:13:28 2005 +++ kaffe/libraries/javalib/javax/swing/plaf/basic/BasicButtonListener.java Sat Jun 11 21:37:13 2005 @@ -87,9 +87,6 @@ if (e.getSource() instanceof AbstractButton) { AbstractButton button = (AbstractButton) e.getSource(); - ButtonModel model = button.getModel(); - model.setArmed(false); - if (button.isFocusPainted()) button.repaint(); } Index: kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTextUI.java diff -u kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTextUI.java:1.13 kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTextUI.java:1.14 --- kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTextUI.java:1.13 Sat Jun 11 20:59:50 2005 +++ kaffe/libraries/javalib/javax/swing/plaf/basic/BasicTextUI.java Sat Jun 11 21:37:13 2005 @@ -352,9 +352,21 @@ doc.addDocumentListener(documentHandler); } + /** + * Returns the name of the keymap for this type of TextUI. + * + * This is implemented so that the classname of this TextUI + * without the package prefix is returned. This way subclasses + * don't have to override this method. + * + * @return the name of the keymap for this TextUI + */ protected String getKeymapName() { - return "BasicTextUI"; + String fullClassName = getClass().getName(); + int index = fullClassName.lastIndexOf('.'); + String className = fullClassName.substring(index + 1); + return className; } protected Keymap createKeymap() =================================================================== Checking out kaffe/libraries/javalib/javax/swing/text/DefaultFormatter.java RCS: /home/cvs/kaffe/kaffe/libraries/javalib/javax/swing/text/DefaultFormatter.java,v VERS: 1.1 *************** --- /dev/null Sun Aug 4 19:57:58 2002 +++ kaffe/libraries/javalib/javax/swing/text/DefaultFormatter.java Sat Jun 11 21:41:16 2005 @@ -0,0 +1,429 @@ +/* DefaultFormatter.java -- +Copyright (C) 2005 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package javax.swing.text; + +import java.io.Serializable; +import java.lang.reflect.Constructor; +import java.text.ParseException; + +import javax.swing.JFormattedTextField; + +/** + * The <code>DefaultFormatter</code> is a concrete formatter for use in + * [EMAIL PROTECTED] JFormattedTextField}s. + * + * It can format arbitrary values by invoking + * their [EMAIL PROTECTED] Object#toString} method. + * + * In order to convert a String back to + * a value, the value class must provide a single argument constructor that + * takes a String object as argument value. If no such constructor is found, + * the String itself is passed back by #stringToValue. + * + * @author Roman Kennke ([EMAIL PROTECTED]) + */ +public class DefaultFormatter + extends JFormattedTextField.AbstractFormatter + implements Cloneable, Serializable +{ + + /** + * A [EMAIL PROTECTED] DocumentFilter} that intercepts modification of the + * JFormattedTextField's Document and commits the value depending + * on the value of the <code>commitsOnValidEdit</code> property. + * + */ + // FIXME: Handle allowsInvalid and overwriteMode properties + private class FormatterDocumentFilter + extends DocumentFilter + { + /** + * Invoked when text is removed from a text component. + * + * @param bypass the FilterBypass to use to mutate the document + * @param offset the start position of the modification + * @param length the length of the removed text + * + * @throws BadLocationException if offset or lenght are invalid in + * the Document + */ + public void remove(DocumentFilter.FilterBypass bypass, int offset, + int length) + throws BadLocationException + { + super.remove(bypass, offset, length); + checkValidInput(); + commitIfAllowed(); + } + + /** + * Invoked when text is inserted into a text component. + * + * @param bypass the FilterBypass to use to mutate the document + * @param offset the start position of the modification + * @param text the inserted text + * @param attributes the attributes of the inserted text + * + * @throws BadLocationException if offset or lenght are invalid in + * the Document + */ + public void insertString(DocumentFilter.FilterBypass bypass, int offset, + String text, AttributeSet attributes) + throws BadLocationException + { + if (overwriteMode == true) + replace(bypass, offset, text.length(), text, attributes); + else + super.insertString(bypass, offset, text, attributes); + checkValidInput(); + commitIfAllowed(); + } + + /** + * Invoked when text is replaced in a text component. + * + * @param bypass the FilterBypass to use to mutate the document + * @param offset the start position of the modification + * @param length the length of the removed text + * @param text the inserted text + * @param attributes the attributes of the inserted text + * + * @throws BadLocationException if offset or lenght are invalid in + * the Document + */ + public void replace(DocumentFilter.FilterBypass bypass, int offset, + int length, String text, AttributeSet attributes) + throws BadLocationException + { + super.replace(bypass, offset, length, text, attributes); + checkValidInput(); + commitIfAllowed(); + } + + /** + * Commits the value to the JTextTextField if the property + * <code>commitsOnValidEdit</code> is set to <code>true</code>. + */ + private void commitIfAllowed() + { + if (commitsOnValidEdit == true) + try + { + getFormattedTextField().commitEdit(); + } + catch (ParseException ex) + { + // ignore invalid edits + } + } + + /** + * Checks if the value in the input field is valid. If the + * property allowsInvalid is set to <code>false</code>, then + * the string in the input field is not allowed to be entered. + * + * @param doc the document of the input field + * @param value the current (old) value of the input field + */ + private void checkValidInput() + { + JFormattedTextField ftf = getFormattedTextField(); + try + { + Object newval = stringToValue(ftf.getText()); + } + catch (ParseException ex) + { + if (!allowsInvalid) + { + // roll back the input if invalid edits are not allowed + try + { + ftf.setText(valueToString(ftf.getValue())); + } + catch (ParseException pe) + { + // if that happens, something serious must be wrong + throw new AssertionError("values must be parseable"); + } + } + } + } + } + + /** The serialVersoinUID. */ + private static final long serialVersionUID = -7369196326612908900L; + + /** + * Indicates if the value should be committed after every + * valid modification of the Document. + */ + boolean commitsOnValidEdit; + + /** + * If <code>true</code> newly inserted characters overwrite existing + * values, otherwise insertion is done the normal way. + */ + boolean overwriteMode; + + /** + * If <code>true</code> invalid edits are allowed for a limited + * time. + */ + boolean allowsInvalid; + + /** + * The class that is used for values. + */ + Class valueClass; + + /** + * Creates a new instance of <code>DefaultFormatter</code>. + */ + public DefaultFormatter() + { + commitsOnValidEdit = true; + overwriteMode = true; + allowsInvalid = true; + valueClass = Object.class; + } + + /** + * Installs the formatter on the specified [EMAIL PROTECTED] JFormattedTextField}. + * + * This method does the following things: + * <ul> + * <li>Display the value of #valueToString in the + * <code>JFormattedTextField</code></li> + * <li>Install the Actions from #getActions on the <code>JTextField</code> + * </li> + * <li>Install the DocumentFilter returned by #getDocumentFilter</li> + * <li>Install the NavigationFilter returned by #getNavigationFilter</li> + * </ul> + * + * This method is typically not overridden by subclasses. Instead override + * one of the mentioned methods in order to customize behaviour. + * + * @param ftf the [EMAIL PROTECTED] JFormattedTextField} in which this formatter + * is installed + */ + public void install(JFormattedTextField ftf) + { + super.install(ftf); + } + + /** + * Returns <code>true</code> if the value should be committed after + * each valid modification of the input field, <code>false</code> if + * it should never be committed by this formatter. + * + * @return the state of the <code>commitsOnValidEdit</code> property + * + * @see #setCommitsOnValidEdit + */ + public boolean getCommitsOnValidEdit() + { + return commitsOnValidEdit; + } + + /** + * Sets the value of the <code>commitsOnValidEdit</code> property. + * + * @param commitsOnValidEdit the new state of the + * <code>commitsOnValidEdit</code> property + * + * @see #getCommitsOnValidEdit + */ + public void setCommitsOnValidEdit(boolean commitsOnValidEdit) + { + this.commitsOnValidEdit = commitsOnValidEdit; + } + + /** + * Returns the value of the <code>overwriteMode</code> property. + * If that is set to <code>true</code> then newly inserted characters + * overwrite existing values, otherwise the characters are inserted like + * normal. The default is <code>true</code>. + * + * @return the value of the <code>overwriteMode</code> property + */ + public boolean getOverwriteMode() + { + return overwriteMode; + } + + /** + * Sets the value of the <code>overwriteMode</code> property. + * + * If that is set to <code>true</code> then newly inserted characters + * overwrite existing values, otherwise the characters are inserted like + * normal. The default is <code>true</code>. + * + * @param overwriteMode the new value for the <code>overwriteMode</code> + * property + */ + public void setOverwriteMode(boolean overwriteMode) + { + this.overwriteMode = overwriteMode; + } + + /** + * Returns whether or not invalid edits are allowed or not. If invalid + * edits are allowed, the JFormattedTextField may temporarily contain invalid + * characters. + * + * @return the value of the allowsInvalid property + */ + public boolean getAllowsInvalid() + { + return allowsInvalid; + } + + /** + * Sets the value of the <code>allowsInvalid</code> property. + * + * @param allowsInvalid the new value for the property + * + * @see #getAllowsInvalid() + */ + public void setAllowsInvalid(boolean allowsInvalid) + { + this.allowsInvalid = allowsInvalid; + } + + /** + * Returns the class that is used for values. When Strings are converted + * back to values, this class is used to create new value objects. + * + * @return the class that is used for values + */ + public Class getValueClass() + { + return valueClass; + } + + /** + * Sets the class that is used for values. + * + * @param valueClass the class that is used for values + * + * @see #getValueClass() + */ + public void setValueClass(Class valueClass) + { + this.valueClass = valueClass; + } + + /** + * Converts a String (from the JFormattedTextField input) to a value. + * In order to achieve this, the formatter tries to instantiate an object + * of the class returned by #getValueClass() using a single argument + * constructor that takes a String argument. If such a constructor cannot + * be found, the String itself is returned. + * + * @param string the string to convert + * + * @return the value for the string + * + * @throws ParseException if the string cannot be converted into + * a value object (e.g. invalid input) + */ + public Object stringToValue(String string) + throws ParseException + { + Object value = string; + Class valueClass = getValueClass(); + if (valueClass == null) + valueClass = getFormattedTextField().getValue().getClass(); + if (valueClass != null) + try + { + Constructor constr = valueClass.getConstructor + (new Class[]{String.class}); + value = constr.newInstance(new Object[]{ string }); + } + catch (NoSuchMethodException ex) + { + // leave value as string + } + catch (Exception ex) + { + throw new ParseException(string, 0); + } + return value; + } + + /** + * Converts a value object into a String. This is done by invoking the + * [EMAIL PROTECTED] Object#toString()} method on the value. + * + * @param value the value to be converted + * + * @return the string representation of the value + * + * @throws ParseException if the value cannot be converted + */ + public String valueToString(Object value) + throws ParseException + { + return value.toString(); + } + + /** + * Creates and returns a clone of this DefaultFormatter. + * + * @return a clone of this object + * + * @throws CloneNotSupportedException not thrown here + */ + public Object clone() + throws CloneNotSupportedException + { + return super.clone(); + } + + /** + * Returns the DocumentFilter that is used to restrict input. + * + * @return the DocumentFilter that is used to restrict input + */ + protected DocumentFilter getDocumentFilter() + { + return new FormatterDocumentFilter(); + } +} _______________________________________________ kaffe mailing list kaffe@kaffe.org http://kaffe.org/cgi-bin/mailman/listinfo/kaffe