classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] many small swing fixes


From: graydon hoare
Subject: [PATCH] many small swing fixes
Date: Mon, 09 Feb 2004 23:32:53 -0500
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6b) Gecko/20031205 Thunderbird/0.4

hi,

the following is a rather fiddly patch. it doesn't actually change *much*, but it makes a lot of minor improvements and adjustments in a lot of places, bringing our swing closer in line with sun's swing.

broadly summarizing (detailed changelog follows), this patch:

  - corrects a number of errors in our UIDefaults and PLAF code.
  - removes a bunch of dead (or wrong) methods and classes which
    either don't exist in sun's libraries or do nothing.
  - replaces a bunch of hard-coded values with UIDefaults lookups.
  - fixes some semantic errors I made in the button model and utilities
    classes.
  - adds some code to implement various button subclasses (checkbox,
    toggle button, radio button), their icons, their behavior, etc.

the results of this, plus the Very Excellent JSlider implementation kho will be posting shortly, is on display for your viewing pleasure at http://people.redhat.com/graydon/free-swing-feb-09-2004.png, running atop the GDK drawing backend.

comments? ok to commit?

-graydon

2004-02-09  Graydon Hoare  <address@hidden>

        * javax/swing/ToggleButtonModel.java: Remove dead class.
        * javax/swing/plaf/basic/BasicDefaults.java: Remove dead class.
        * javax/swing/plaf/basic/BasicButtonListener.java: New class.
        * javax/swing/plaf/basic/BasicRootPaneUI.java: New class.
        * Makefile.am: Update for new and removed files.

        * gnu/java/awt/peer/gtk/GdkGraphics2D.java: Initialize default hints.
        * javax/swing/AbstractButton.java
        (AbstractButton): Initialize fields correctly in ctor.
        * javax/swing/JCheckbox.java
        (JCheckBox): Override painting flags.
        * javax/swing/DefaultButtonModel.java: Conform to sun.
        * javax/swing/JComponent.java (paint): Fill with background color
        if available.
        (processComponentKeyEvent)
        (processFocusEvent)
        (processKeyEvent)
        (processMouseMotionEvent): Remove event-consuming empty methods.
        (getUIClassID): Return "ComponentUI" not "JComponent"
        * javax/swing/JFrame.java: Remove some debugging chatter.
        (JFrame): Subscribe to window events.
        * javax/swing/JRadioButton.java
        (JRadioButton): Override painting flags.
        * javax/swing/JRootPane.java
        (JRootPane): Set background from UIDefaults.
        * javax/swing/JToggleButton.java
        (ToggleButtonModel): New inner class.
        (JToggleButton): Override layout alighment.
        * javax/swing/SwingUtilities.java:
        (getLocalBounds): Return width and height, not x and y.
        (calculateInnerArea): Use local bounds, not bounds.
        (layoutCompoundLabel): Provide overridden form.
        (layoutCompoundLabel): Correct bugs.
        * javax/swing/UIDefaults.java: Correct comment.
        * javax/swing/plaf/basic/BasicButtonUI.java:
        Move most logic into defaults, external listener.
        (paintIcon): Implement icon painting.
        (paint): Fix state painting to conform to changes in model.
        * javax/swing/plaf/basic/BasicCheckBoxUI.java:
        Remove most dead/wrong methods.
        (getDefaultIcon): Return defaults.getIcon("CheckBox.icon").
        * javax/swing/plaf/basic/BasicIconFactory.java:
        (DummyIcon): New class.
        (getMenuItemCheckIcon)
        (getMenuItemArrowIcon)
        (getMenuArrowIcon)
        (getCheckBoxMenuItemIcon)
        (getRadioButtonMenuItemIcon)
        (createEmptyFrameIcon): Return DummyIcons, not null.
        (getCheckBoxIcon): Implement an icon that looks like sun's.
        (getRadioButtonIcon): Implement an icon that looks like sun's.
        * javax/swing/plaf/basic/BasicLookAndFeel.java
        (initComponentDefaults): Fix impossible values, add some missing.
        * javax/swing/plaf/basic/BasicPanelUI.java (gap): Remove field.
        * javax/swing/plaf/basic/BasicRadioButtonUI.java:
        Remove most dead/wrong methods.
        (icon): New field.
        (getDefaultIcon): New method.
        * javax/swing/plaf/basic/BasicToggleButtonUI.java:
        Remove most dead/wrong methods.
        * javax/swing/plaf/metal/MetalLookAndFeel.java
        (getDefaults): Return super.getDefaults(), not BasicDefaults.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
        (Java_gnu_java_awt_peer_gtk_GdkGraphics_clearRect):
        Implement "clearing" as drawing, when on pixmap drawables.

        * javax/swing/JButton.java (getUIClassID):
        * javax/swing/JCheckBox.java (getUIClassID):
        * javax/swing/JEditorPane.java (getUIClassID):
        * javax/swing/JLabel.java (getUIClassID):
        * javax/swing/JList.java (getUIClassID):
        * javax/swing/JOptionPane.java (getUIClassID):
        * javax/swing/JPanel.java (getUIClassID):
        * javax/swing/JPasswordField.java (uiClassID):
        * javax/swing/JRadioButton.java (getUIClassID):
        * javax/swing/JRootPane.java (getUIClassID):
        * javax/swing/JScrollPane.java (getUIClassID):
        * javax/swing/JTabbedPane.java (getUIClassID):
        * javax/swing/JToggleButton.java (getUIClassID):
        * javax/swing/JTree.java (getUIClassID):
        * javax/swing/JViewport.java (getUIClassID):
        * javax/swing/text/JTextComponent.java (getUIClassID):
        Return "fooUI" not "Jfoo"

--- Makefile.am 29 Jan 2004 19:28:24 -0000      1.359
+++ Makefile.am 10 Feb 2004 04:19:04 -0000
@@ -1287,16 +1241,18 @@
 javax/swing/GrayFilter.java \
 javax/swing/AbstractAction.java \
 javax/swing/AbstractButton.java \
+javax/swing/plaf/basic/BasicButtonListener.java \
 javax/swing/plaf/basic/BasicButtonUI.java \
 javax/swing/plaf/basic/BasicCheckBoxUI.java \
-javax/swing/plaf/basic/BasicDefaults.java \
 javax/swing/plaf/basic/BasicGraphicsUtils.java \
 javax/swing/plaf/basic/BasicLabelUI.java \
 javax/swing/plaf/basic/BasicListUI.java \
 javax/swing/plaf/basic/BasicOptionPaneUI.java \
 javax/swing/plaf/basic/BasicPanelUI.java \
+javax/swing/plaf/basic/BasicRootPaneUI.java \
 javax/swing/plaf/basic/BasicRadioButtonUI.java \
 javax/swing/plaf/basic/BasicScrollPaneUI.java \
+javax/swing/plaf/basic/BasicSliderUI.java \
 javax/swing/plaf/basic/BasicSplitPaneDivider.java \
 javax/swing/plaf/basic/BasicSplitPaneUI.java \
 javax/swing/plaf/basic/BasicTabbedPaneUI.java \
@@ -1416,7 +1372,6 @@
 javax/swing/SwingConstants.java \
 javax/swing/SwingUtilities.java \
 javax/swing/Timer.java \
-javax/swing/ToggleButtonModel.java \
 javax/swing/UIDefaults.java \
 javax/swing/UIManager.java \
 javax/swing/UnsupportedLookAndFeelException.java \
--- gnu/java/awt/peer/gtk/GdkGraphics2D.java    16 Jan 2004 14:22:23 -0000      
1.6
+++ gnu/java/awt/peer/gtk/GdkGraphics2D.java    10 Feb 2004 04:19:06 -0000
@@ -158,7 +158,7 @@
     setFont (new Font("SansSerif", Font.PLAIN, 12));
     setTransform (new AffineTransform ());
     setStroke (new BasicStroke ());
-    setRenderingHints (new HashMap ());
+    setRenderingHints (getDefaultHints());
 
     stateStack = new Stack();
   }
@@ -174,7 +174,7 @@
     setFont (new Font("SansSerif", Font.PLAIN, 12));
     setTransform (new AffineTransform ());
     setStroke (new BasicStroke ());
-    setRenderingHints (new HashMap ());
+    setRenderingHints (getDefaultHints());
 
     stateStack = new Stack ();
   }
--- javax/swing/AbstractButton.java     22 Jan 2004 09:54:15 -0000      1.4
+++ javax/swing/AbstractButton.java     10 Feb 2004 04:19:07 -0000
@@ -186,19 +186,19 @@
   String text;
 
   /** The vertical alignment of the button's text and icon. */
-  int vert_align = CENTER;
+  int vert_align;
 
   /** The horizontal alignment of the button's text and icon. */
-  int hori_align = CENTER;
+  int hori_align;
 
   /** The horizontal position of the button's text relative to its icon. */
-  int hori_text_pos = CENTER;
+  int hori_text_pos;
 
   /** The vertical position of the button's text relative to its icon. */
-  int vert_text_pos = CENTER;
+  int vert_text_pos;
 
   /** Whether or not the button paints its border. */
-  boolean paint_border = true;
+  boolean paint_border;
 
   /** Whether or not the button paints its focus state. */
   boolean paint_focus;
@@ -487,8 +487,16 @@
     model.addChangeListener(changeListener);
     model.addItemListener(itemListener);
 
+    hori_align = CENTER;
+    hori_text_pos = TRAILING;
+    vert_align = CENTER;
+    vert_text_pos = CENTER;
+    paint_border = true;
+    content_area_filled = true;
+
     setAlignmentX(LEFT_ALIGNMENT);
     setAlignmentY(CENTER_ALIGNMENT);
+
     addFocusListener(new ButtonFocusListener());
     updateUI();
   }
--- javax/swing/DefaultButtonModel.java 22 Jan 2004 09:54:15 -0000      1.4
+++ javax/swing/DefaultButtonModel.java 10 Feb 2004 04:19:07 -0000
@@ -55,15 +55,23 @@
  * button. The concrete button type holding this state may be a a "toggle"
  * button (checkbox, radio button) or a "push" button (menu button, button).
  * 
- * Any change to the model's properties will trigger the firing of a
- * ChangeEvent.
+ * If the model is disabled, only the "selected" property can be changed.
+ * An attempt to change the "armed", "rollover" or "pressed" properties 
+ * while the model is disabled will be blocked.
+ *
+ * Any successful (non-blocked) change to the model's properties will
+ * trigger the firing of a ChangeEvent.
+ *
+ * Any change to the "selected" property will trigger the firing of an
+ * ItemEvent in addition to ChangeEvent. This is true whether the model is
+ * enabled or not.
+ *
+ * One other state change is special: the transition from "enabled, armed
+ * and pressd" to "enabled, armed and not-pressed". This is considered the
+ * "trailing edge" of a successful mouse click, and therefore fires an 
+ * ActionEvent in addition to a ChangeEvent.
  *
- * Any change to the "pressed" property will trigger the firing of an
- * ItemEvent in addition to ChangeEvent.
- *
- * Any change which causes the enabled, armed and pressed properties to
- * simultaneously become <code>true</code> will trigger the firing of an
- * ActionEvent in addition to the ChangeEvent.
+ * In all other respects this class is just a container of boolean flags.
  *
  * @author Graydon Hoare (graydon&064;redhat.com)
  */
@@ -80,9 +88,9 @@
    be pressed or selected unless they are enabled. */
   static int ENABLED = 2;
 
-  /** State constant indicating that the button has been fully
-   pressed. This usually happens when a user has released the mouse over a
-   previously "armed" button. */
+  /** State constant indicating that the user is holding down the button.
+   When this transitions from true to false, an ActionEvent may be fired,
+   depending on the value of the "armed" property.*/
   static int PRESSED = 4;
 
   /** State constant indicating that the mouse is currently positioned over
@@ -120,7 +128,8 @@
 
   public DefaultButtonModel()
   {
-    stateMask = 0;
+    stateMask = ENABLED;
+    mnemonic = java.awt.event.KeyEvent.VK_UNDEFINED;
     listenerList = new EventListenerList();    
     changeEvent = new ChangeEvent(this);
   }
@@ -262,13 +271,15 @@
     if (oldstate == newstate)
       return;
 
+    if ((stateflag != SELECTED) 
+        && (stateflag != ENABLED)
+        && (stateMask & ENABLED) == 0)
+      return;
+
     stateMask = newstate;
 
     fireStateChanged(changeEvent);
 
-    if ((newstate & ENABLED) == 0)
-      return;
-
     if ((oldstate & SELECTED) == 0
         && (newstate & SELECTED) == SELECTED)
       fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, 
@@ -279,14 +290,13 @@
       fireItemStateChanged(new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, 
                                          null, ItemEvent.DESELECTED));
 
-    else if ((newstate & ARMED) == ARMED
-             && (newstate & PRESSED) == PRESSED)
+    else if (((oldstate & ARMED) == ARMED && (oldstate & PRESSED) == PRESSED)
+             &&
+             ((newstate & ARMED) == ARMED && (newstate & PRESSED) == 0))
            {
         fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
                                             actionCommand));
-        stateMask = stateMask & ~(PRESSED | ARMED);
            }
-    
     }
 
   /**
--- javax/swing/JButton.java    9 Jan 2004 10:18:47 -0000       1.3
+++ javax/swing/JButton.java    10 Feb 2004 04:19:07 -0000
@@ -98,7 +98,7 @@
     public String getUIClassID()
     {
        //Returns a string that specifies the name of the L&F class that 
renders this component.  
-       return "JButton";
+       return "ButtonUI";
     }
   
     public boolean isDefaultButton()
--- javax/swing/JCheckBox.java  11 Jun 2003 13:20:39 -0000      1.2
+++ javax/swing/JCheckBox.java  10 Feb 2004 04:19:07 -0000
@@ -70,6 +70,8 @@
     public JCheckBox(String text, Icon icon)
     {
        super(text, icon);
+        paint_border = false;
+        content_area_filled = false;
     }
 
     
@@ -82,7 +84,7 @@
     public String getUIClassID()
     {
        //Returns a string that specifies the name of the L&F class that 
renders this component.  
-       return "JCheckBox";
+       return "CheckBoxUI";
     }
   
     protected  String paramString()
--- javax/swing/JComponent.java 28 Jan 2004 19:37:58 -0000      1.6
+++ javax/swing/JComponent.java 10 Feb 2004 04:19:07 -0000
@@ -765,6 +765,14 @@
                {
                        im = createImage (r.width, r.height);
                        g2 = im.getGraphics ();
+                  if (this.getBackground() != null)
+                    {
+                      Color save = g2.getColor();
+                      g2.setColor(this.getBackground());
+                      g2.fillRect (0, 0, r.width, r.height);
+                      g2.setColor(save);
+                    }
+                  else
                        g2.clearRect (0, 0, r.width, r.height);
                }
                
@@ -837,28 +845,6 @@
                //      Returns a string representation of this JComponent.
                return "JComponent";
        }
-       protected  void processComponentKeyEvent(KeyEvent e)
-       {
-               //     Process any key events that the component itself 
recognizes.
-           //System.out.println("COMP_KEY-EVENT: " + e);
-       }
-       protected  void processFocusEvent(FocusEvent e)
-       {
-               //      Processes focus events occurring on this component by 
dispatching them to any registered FocusListener objects.
-           //System.out.println("FOCUS_EVENT: " + e);
-       }
-
-       protected  void processKeyEvent(KeyEvent e)
-       {
-               //      Override processKeyEvent to process events protected
-           //System.out.println("KEY-EVENT: " + e);
-       }
-
-        public void processMouseMotionEvent(MouseEvent e)
-       {
-           //      Processes mouse motion events occurring on this component 
by dispatching them to any registered MouseMotionListener objects.
-           //System.out.println("COMP_MOUSE-EVENT: " + e + ", MEMORY = " + 
Runtime.getRuntime().freeMemory());
-       }
 
        public void registerKeyboardAction(ActionListener anAction,
                                    KeyStroke aKeyStroke,
@@ -1044,7 +1030,7 @@
         public String getUIClassID()
        {
                ///          Return the UIDefaults key used to look up the name 
of the swing.
-               return "JComponent";
+               return "ComponentUI";
        }
 
        protected void setUI(ComponentUI newUI)
--- javax/swing/JEditorPane.java        5 Feb 2004 18:48:53 -0000       1.4
+++ javax/swing/JEditorPane.java        10 Feb 2004 04:19:07 -0000
@@ -137,7 +137,7 @@
     { return super.getText();    }
     
     public String getUIClassID()
-    {    return "JEditorPane";  }
+    {    return "EditorPaneUI";  }
 
     public boolean isFocusCycleRoot()
     { return focus_root;    }
--- javax/swing/JFrame.java     22 Nov 2003 00:03:35 -0000      1.3
+++ javax/swing/JFrame.java     10 Feb 2004 04:19:07 -0000
@@ -38,6 +38,7 @@
 
 package javax.swing;
 
+import java.awt.AWTEvent;
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Container;
@@ -105,6 +106,7 @@
     protected  void frameInit()
     {
       super.setLayout(new BorderLayout(1, 1));
+      enableEvents(AWTEvent.WINDOW_EVENT_MASK);
       getRootPane(); // will do set/create
     }
   
@@ -201,9 +203,7 @@
 
     protected  void processWindowEvent(WindowEvent e)
     {
-       //      System.out.println("PROCESS_WIN_EV-1: " + e);
        super.processWindowEvent(e); 
-       //      System.out.println("PROCESS_WIN_EV-2: " + e);
        switch (e.getID())
            {
            case WindowEvent.WINDOW_CLOSING:
@@ -212,13 +212,11 @@
                        {
                        case EXIT_ON_CLOSE:
                            {
-                               System.out.println("user requested exit on 
close");
                                System.exit(1);
                                break;
                            }
                        case DISPOSE_ON_CLOSE:
                            {
-                               System.out.println("user requested dispose on 
close");
                                dispose();
                                break;
                            }
--- javax/swing/JLabel.java     5 Feb 2004 18:48:53 -0000       1.3
+++ javax/swing/JLabel.java     10 Feb 2004 04:19:07 -0000
@@ -148,7 +148,7 @@
     {  return text;    }
 
     public String getUIClassID()
-    {  return "JLabel";    }
+    {  return "LabelUI";    }
 
     public int getVerticalAlignment()
     {
--- javax/swing/JList.java      5 Feb 2004 18:48:53 -0000       1.3
+++ javax/swing/JList.java      10 Feb 2004 04:19:07 -0000
@@ -212,7 +212,7 @@
 
     public String getUIClassID()
     {
-       return "JList";
+       return "ListUI";
     }
 
 
--- javax/swing/JOptionPane.java        11 Jun 2003 13:20:39 -0000      1.2
+++ javax/swing/JOptionPane.java        10 Feb 2004 04:19:07 -0000
@@ -161,7 +161,7 @@
     {  return val;    }
 
     public String getUIClassID()
-    {  return "JOptionPane";    }
+    {  return "OptionPaneUI";    }
 
 
     public void setUI(OptionPaneUI ui) {
--- javax/swing/JPanel.java     9 Jan 2004 10:18:47 -0000       1.3
+++ javax/swing/JPanel.java     10 Feb 2004 04:19:07 -0000
@@ -85,7 +85,7 @@
     } 
 
     public String getUIClassID()
-    {  return "JPanel";    }
+    {  return "PanelUI";    }
 
 
     public void setUI(PanelUI ui) {
--- javax/swing/JPasswordField.java     9 Jan 2004 10:18:47 -0000       1.3
+++ javax/swing/JPasswordField.java     10 Feb 2004 04:19:07 -0000
@@ -102,7 +102,7 @@
        /**
         * uiClassID
         */
-       private static final String uiClassID = "PasswordFIeldUI";
+       private static final String uiClassID = "PasswordFieldUI";
 
        /**
         * echoChar.  Default is 0
--- javax/swing/JRadioButton.java       11 Jun 2003 13:20:39 -0000      1.2
+++ javax/swing/JRadioButton.java       10 Feb 2004 04:19:07 -0000
@@ -65,6 +65,8 @@
     public JRadioButton(String text, Icon icon)
     {
        super(text, icon);
+        paint_border = false;
+        content_area_filled = false;
     }
 
     
@@ -77,7 +79,7 @@
     public String getUIClassID()
     {
        //Returns a string that specifies the name of the L&F class that 
renders this component.  
-       return "JRadioButton";
+       return "RadioButtonUI";
     }
   
     protected  String paramString()
--- javax/swing/JRootPane.java  22 Nov 2003 00:03:35 -0000      1.3
+++ javax/swing/JRootPane.java  10 Feb 2004 04:19:07 -0000
@@ -75,7 +75,6 @@
       public Dimension preferredLayoutSize ( Container c )
        {           
          Dimension p = super.preferredLayoutSize(c);
-         System.out.println("              PREF-SIZE from RootLayout = " + p);
          return p;
        }        
     }
@@ -97,7 +96,7 @@
     /********************************************************/
 
     public String getUIClassID()
-    {  return "JPanel";    }
+    {  return "RootPaneUI";    }
 
     
     void setJMenuBar(JMenuBar m)
@@ -169,7 +168,7 @@
     JRootPane()
     {
        setLayout(createRootLayout());
-       
+       setBackground(UIManager.getColor("control"));
        getGlassPane();
        getLayeredPane();
        getContentPane();
--- javax/swing/JScrollPane.java        11 Jun 2003 13:20:39 -0000      1.2
+++ javax/swing/JScrollPane.java        10 Feb 2004 04:19:07 -0000
@@ -86,7 +86,7 @@
     public String getUIClassID()
     {
        //Returns a string that specifies the name of the L&F class that 
renders this component.  
-       return "JScrollPane";
+       return "ScrollPaneUI";
     }
 
     public JViewport getViewport()
--- javax/swing/JTabbedPane.java        11 Jun 2003 13:20:39 -0000      1.2
+++ javax/swing/JTabbedPane.java        10 Feb 2004 04:19:07 -0000
@@ -102,7 +102,7 @@
     }
     
     public String getUIClassID()
-    {  return "JTabbedPane";    }
+    {  return "TabbedPaneUI";    }
 
 
     public void setUI(TabbedPaneUI ui) {
--- javax/swing/JToggleButton.java      22 Jan 2004 09:54:15 -0000      1.3
+++ javax/swing/JToggleButton.java      10 Feb 2004 04:19:07 -0000
@@ -44,6 +44,24 @@
 
 public class JToggleButton extends AbstractButton implements Accessible
 {
+
+  public class ToggleButtonModel extends DefaultButtonModel
+  {
+    public void setPressed(boolean b)  
+    {
+      if (! isEnabled())
+        return;
+      
+      super.setPressed(b);
+      
+      // setPressed(false) == mouse release on us,
+      // if we were armed, we flip the selected state.
+      if (!b && isArmed())
+        setSelected(! isSelected());
+    }
+  }
+
+
     public JToggleButton()
     {
        this(null, null);
@@ -73,9 +91,8 @@
     {
        super(text, icon);
 
-        // Create the model
+    hori_align = LEADING;
         setModel(new ToggleButtonModel());
-       
         model.setSelected(selected);
     }
 
@@ -90,7 +107,7 @@
     public String getUIClassID()
     {
        //Returns a string that specifies the name of the L&F class that 
renders this component.  
-       return "JToggleButton";
+    return "ToggleButtonUI";
     }
   
     protected  String paramString()
--- javax/swing/JTree.java      11 Jun 2003 13:20:39 -0000      1.2
+++ javax/swing/JTree.java      10 Feb 2004 04:19:07 -0000
@@ -83,7 +83,7 @@
     
     public String getUIClassID()
     {
-       return "JTree";
+       return "TreeUI";
     }
 
 
--- javax/swing/JViewport.java  11 Jun 2003 13:20:39 -0000      1.2
+++ javax/swing/JViewport.java  10 Feb 2004 04:19:07 -0000
@@ -69,7 +69,7 @@
 
     public String getUIClassID()
     {
-       return "JViewport";
+       return "ViewportUI";
     }
 
     public void updateUI()
--- javax/swing/SwingUtilities.java     4 Feb 2004 20:43:32 -0000       1.5
+++ javax/swing/SwingUtilities.java     10 Feb 2004 04:19:07 -0000
@@ -95,7 +95,9 @@
   /**
    * Calculates the portion of the component's bounds which is inside the
    * component's border insets. This area is usually the area a component
-   * should confine its painting to.
+   * should confine its painting to. The coordinates are returned in terms
+   * of the <em>component's</em> coordinate system, where (0,0) is the
+   * upper left corner of the component's bounds.
    *
    * @param c The component to measure the bounds of
    * @param r A Rectangle to store the return value in, or
@@ -108,7 +110,8 @@
    */
   public static Rectangle calculateInnerArea(JComponent c, Rectangle r)
   {
-    return calculateInsetArea(c.getBounds(), c.getInsets(), r);
+    Rectangle b = getLocalBounds(c);
+    return calculateInsetArea(b, c.getInsets(), r);
   }
 
   /**
@@ -123,7 +126,7 @@
   public static Rectangle getLocalBounds(Component aComponent)
   {
     Rectangle bounds = aComponent.getBounds();
-    return new Rectangle(0, 0, bounds.x, bounds.y);
+    return new Rectangle(0, 0, bounds.width, bounds.height);
   }
 
   /**
@@ -460,6 +463,7 @@
       ((JComponent)comp).updateUI();
   }
 
+
   /**
    * <p>Layout a "compound label" consisting of a text string and an icon
    * which is to be placed near the rendered text. Once the text and icon
@@ -472,9 +476,10 @@
    *
    * <p>The position values control where the text is placed relative to
    * the icon. The horizontal position value should be one of the constants
-   * <code>LEFT</code>, <code>RIGHT</code> or <code>CENTER</code>. The
-   * vertical position value should be one fo the constants
-   * <code>TOP</code>, <code>BOTTOM</code>, <code>CENTER</code>.</p>
+   * <code>LEADING</code>, <code>TRAILING</code>, <code>LEFT</code>,
+   * <code>RIGHT</code> or <code>CENTER</code>. The vertical position value
+   * should be one fo the constants <code>TOP</code>, <code>BOTTOM</code>
+   * or <code>CENTER</code>.</p>
    *
    * <p>The text-icon gap value controls the number of pixels between the
    * icon and the text.</p>
@@ -488,12 +493,12 @@
    * <code>CENTER</code>.</p>
    *
    * <p>If the <code>LEADING</code> or <code>TRAILING</code> constants are
-   * given for horizontal alignment, they are interpreted relative to the
-   * provided component's orientation property, a constant in the 
address@hidden
-   * java.awt.ComponentOrientation} class. For example, if the component's
-   * orientation is <code>LEFT_TO_RIGHT</code>, then the
-   * <code>LEADING</code> alignment is a synonym for <code>LEFT</code> and
-   * the <code>TRAILING</code> alignment is a synonym for
+   * given for horizontal alignment or horizontal text position, they are
+   * interpreted relative to the provided component's orientation property,
+   * a constant in the address@hidden java.awt.ComponentOrientation} class. For
+   * example, if the component's orientation is <code>LEFT_TO_RIGHT</code>,
+   * then the <code>LEADING</code> value is a synonym for <code>LEFT</code>
+   * and the <code>TRAILING</code> value is a synonym for
    * <code>RIGHT</code></p>
    *
    * <p>If the text and icon are equal to or larger than the view
@@ -523,6 +528,7 @@
    * @return The string of characters, possibly truncated with an elipsis,
    * which is laid out in this label
    */
+
   public static String layoutCompoundLabel(JComponent c, 
                                            FontMetrics fm,
                                            String text, 
@@ -537,6 +543,119 @@
                                            int textIconGap)
   {
 
+    // Fix up the orientation-based horizontal positions.
+
+    if (horizontalTextPosition == LEADING)
+      {
+        if (c.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT)
+          horizontalTextPosition = RIGHT;
+        else
+          horizontalTextPosition = LEFT;
+      }
+    else if (horizontalTextPosition == TRAILING)
+      {
+        if (c.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT)
+          horizontalTextPosition = LEFT;
+        else
+          horizontalTextPosition = RIGHT;
+      }
+
+    // Fix up the orientation-based alignments.
+
+    if (horizontalAlignment == LEADING)
+      {
+        if (c.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT)
+          horizontalAlignment = RIGHT;
+        else
+          horizontalAlignment = LEFT;
+      }
+    else if (horizontalAlignment == TRAILING)
+      {
+        if (c.getComponentOrientation() == ComponentOrientation.RIGHT_TO_LEFT)
+          horizontalAlignment = LEFT;
+        else
+          horizontalAlignment = RIGHT;
+      }
+    
+    return layoutCompoundLabel(fm, text, icon,
+                               verticalAlignment,
+                               horizontalAlignment,
+                               verticalTextPosition,
+                               horizontalTextPosition,
+                               viewR, iconR, textR, textIconGap);
+  }
+
+  /**
+   * <p>Layout a "compound label" consisting of a text string and an icon
+   * which is to be placed near the rendered text. Once the text and icon
+   * are laid out, the text rectangle and icon rectangle parameters are
+   * altered to store the calculated positions.</p>
+   *
+   * <p>The size of the text is calculated from the provided font metrics
+   * object.  This object should be the metrics of the font you intend to
+   * paint the label with.</p>
+   *
+   * <p>The position values control where the text is placed relative to
+   * the icon. The horizontal position value should be one of the constants
+   * <code>LEFT</code>, <code>RIGHT</code> or <code>CENTER</code>. The
+   * vertical position value should be one fo the constants
+   * <code>TOP</code>, <code>BOTTOM</code> or <code>CENTER</code>.</p>
+   *
+   * <p>The text-icon gap value controls the number of pixels between the
+   * icon and the text.</p>
+   *
+   * <p>The alignment values control where the text and icon are placed, as
+   * a combined unit, within the view rectangle. The horizontal alignment
+   * value should be one of the constants <code>LEFT</code>, 
<code>RIGHT</code> or
+   * <code>CENTER</code>. The vertical alignment valus should be one of the
+   * constants <code>TOP</code>, <code>BOTTOM</code> or
+   * <code>CENTER</code>.</p>
+   *
+   * <p>If the text and icon are equal to or larger than the view
+   * rectangle, the horizontal and vertical alignment values have no
+   * affect.</p>
+   *
+   * <p>Note that this method does <em>not</em> know how to deal with
+   * horizontal alignments or positions given as <code>LEADING</code> or
+   * <code>TRAILING</code> values. Use the other overloaded variant of this
+   * method if you wish to use such values.
+   *
+   * @param fm The font metrics used to measure the text
+   * @param text The text to place in the compound label
+   * @param icon The icon to place next to the text
+   * @param verticalAlignment The vertical alignment of the label relative
+   * to its component
+   * @param horizontalAlignment The horizontal alignment of the label
+   * relative to its component
+   * @param verticalTextPosition The vertical position of the label's text
+   * relative to its icon
+   * @param horizontalTextPosition The horizontal position of the label's
+   * text relative to its icon
+   * @param viewR The view rectangle, specifying the area which layout is
+   * constrained to
+   * @param iconR A rectangle which is modified to hold the laid-out
+   * position of the icon
+   * @param textR A rectangle which is modified to hold the laid-out
+   * position of the text
+   * @param textIconGap The distance between text and icon
+   *
+   * @return The string of characters, possibly truncated with an elipsis,
+   * which is laid out in this label
+   */
+
+  public static String layoutCompoundLabel(FontMetrics fm,
+                                           String text,
+                                           Icon icon,
+                                           int verticalAlignment,
+                                           int horizontalAlignment,
+                                           int verticalTextPosition,
+                                           int horizontalTextPosition,
+                                           Rectangle viewR,
+                                           Rectangle iconR,
+                                           Rectangle textR,
+                                           int textIconGap)
+  {
+
     // Work out basic height and width.
 
     if (icon == null)
@@ -589,23 +708,6 @@
         textR.y = centerLine - textR.height/2;
         iconR.y = centerLine - iconR.height/2;
         break;
-      }
-
-    // Fix up the orientation-based alignments.
-
-    if (horizontalAlignment == LEADING)
-      {
-        if (c.getComponentOrientation() == ComponentOrientation.LEFT_TO_RIGHT)
-          horizontalAlignment = LEFT;
-        else if (c.getComponentOrientation() == 
ComponentOrientation.RIGHT_TO_LEFT)
-          horizontalAlignment = RIGHT;
-      }
-    else if (horizontalAlignment == TRAILING)
-      {
-        if (c.getComponentOrientation() == ComponentOrientation.LEFT_TO_RIGHT)
-          horizontalAlignment = RIGHT;
-        else if (c.getComponentOrientation() == 
ComponentOrientation.RIGHT_TO_LEFT)
-          horizontalAlignment = LEFT;
       }
 
     // The two rectangles are laid out correctly now, but only assuming
--- javax/swing/UIDefaults.java 27 Nov 2003 09:04:01 -0000      1.6
+++ javax/swing/UIDefaults.java 10 Feb 2004 04:19:08 -0000
@@ -61,7 +61,7 @@
 /**
  * UIDefaults is a database where all settings and interface bindings are
  * stored into. An PLAF implementation fills one of these (see for example
- * plaf/basic/BasicDefaults.java) with "JButton" -> new BasicButtonUI().
+ * plaf/basic/BasicLookAndFeel.java) with "ButtonUI" -> new BasicButtonUI().
  *
  * @author Ronald Veldema (address@hidden)
  */
--- javax/swing/plaf/basic/BasicButtonUI.java   22 Jan 2004 09:54:17 -0000      
1.5
+++ javax/swing/plaf/basic/BasicButtonUI.java   10 Feb 2004 04:19:08 -0000
@@ -47,14 +47,20 @@
 import java.awt.Stroke;
 import java.awt.Insets;
 import java.awt.Rectangle;
+import java.awt.event.FocusListener;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import javax.swing.AbstractButton;
+import javax.swing.ButtonModel;
+import javax.swing.Icon;
 import javax.swing.JComponent;
 import javax.swing.SwingUtilities;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
+import javax.swing.event.MouseInputListener;
 import javax.swing.plaf.ButtonUI;
 import javax.swing.plaf.ComponentUI;
 
@@ -62,21 +68,11 @@
 {
   /** A constant used to pad out elements in the button's layout and
       preferred size calculations. */
-    int gap = 3;
+  int defaultTextIconGap = 3;
 
-  /** The color that text will be painted when the button is enabled */
-  Color textColor;
-
-  /** The color that text will be painted when the button is disabled */
-  Color disabledTextColor;
-
-  /** The color that the button's background will be painted when the
-      button is pressed. */
-    Color pressedBackgroundColor;
-
-  /** The color that the button's background will be painted when the
-      button is not pressed. */
-  Color normalBackgroundColor;
+  /** A constant added to the defaultTextIconGap to adjust the text
+      within this particular button. */
+  int defaultTextShiftOffset = 0;
 
   /**
    * Factory method to create an instance of BasicButtonUI for a given
@@ -91,120 +87,60 @@
        return new BasicButtonUI();
     }
 
-  /**
-   * Helper class which listens to a button's focus events and disarms the
-   * button's model when focus is lost.
-   */
-  private static class FocusUIListener extends FocusAdapter
+  public int getDefaultTextIconGap(AbstractButton b)
   {
-    /** Button to listen to focus events from */
-    AbstractButton button;
+    return defaultTextIconGap;
+  }
 
-    /**
-     * Creates a new FocusUIListener object.
-     *
-     * @param b The button to listen to
-     */
-    FocusUIListener(AbstractButton b)
+  protected void installDefaults(AbstractButton b)
     {
-      button = b;
+    UIDefaults defaults = UIManager.getLookAndFeelDefaults();
+    b.setForeground(defaults.getColor("Button.foreground"));
+    b.setBackground(defaults.getColor("Button.background"));
+    b.setMargin(defaults.getInsets("Button.margin"));
+    b.setBorder(defaults.getBorder("Button.border"));
     }
     
-    /**
-     * Called when the button loses focus.
-     *
-     * @param event The loss of focus event.
-     */
-    public void focusLost(FocusEvent event)
+  protected void uninstallDefaults(AbstractButton b)
     {
-      // System.err.println("ButtonUI :: lost focus -- disarming");
-      button.getModel().setArmed(false);
-    }
+    b.setForeground(null);
+    b.setBackground(null);
+    b.setBorder(null);
+    b.setMargin(null);
   }
 
-  /**
-   * A helper class which interprets mouse events as 
-   * state changes to the button's underlying model.
-   */
-  private static class ButtonUIListener extends MouseAdapter
-  {
-    /** The button to change the model of */
-    AbstractButton button;
+  protected BasicButtonListener listener;
 
-    /**
-     * Creates a new ButtonUIListener object.
-     *
-     * @param b The button to change the model of
-     */
-    public ButtonUIListener(AbstractButton b)
+  protected BasicButtonListener createButtonListener(AbstractButton b)
     {
-      button = b;
+    return new BasicButtonListener();
     }
 
-    /**
-     * Accept a mouse press event and arm the button's model.
-     *
-     * @param e The mouse press event to accept
-     */
-    public void mousePressed(MouseEvent e)
-    {
-      // System.err.println("ButtonUI :: mouse pressed");
-      if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0)
+  public void installListeners(AbstractButton b)
         {
-          // System.err.println("ButtonUI :: arming");
-          button.getModel().setArmed(true);
-        }
+    listener = createButtonListener(b);
+    b.addChangeListener(listener);
+    b.addPropertyChangeListener(listener);
+    b.addFocusListener(listener);    
+    b.addMouseListener(listener);
+    b.addMouseMotionListener(listener);
     }
 
-    /**
-     * Accept a mouse enter event and set the button's model's
-     * "rollover" property to <code>true</code>. If the button's
-     * model is currently armed and the mouse button is not held
-     * down, this enter event will also disarm the model.
-     *
-     * @param e The mouse enter event to accept
-     */
-    public void mouseEntered(MouseEvent e)
+  public void uninstallListeners(AbstractButton b)
     {
-      // System.err.println("ButtonUI :: mouse entered");
-      // System.err.println("ButtonUI :: rolling over");
-      button.getModel().setRollover(true);
-      if (button.getModel().isArmed() 
-          && (e.getModifiers() & InputEvent.BUTTON1_MASK) == 0)
-        {
-          // System.err.println("ButtonUI :: no button pressed -- disarming");
-          button.getModel().setArmed(false);
-        }
+    b.removeChangeListener(listener);
+    b.removePropertyChangeListener(listener);
+    b.removeFocusListener(listener);    
+    b.removeMouseListener(listener);
+    b.removeMouseMotionListener(listener);
     }
 
-    /**
-     * Accept a mouse exit event and set the button's model's
-     * "rollover" property to <code>false</code>.
-     *
-     * @param e The mouse exit event to accept
-     */
-    public void mouseExited(MouseEvent e)
+  protected void installKeyboardActions(AbstractButton b)
     {
-      // System.err.println("ButtonUI :: mouse exited");
-      button.getModel().setRollover(false);
     }
 
-    /**
-     * Accept a mouse release event and set the button's model's
-     * "pressed" property to <code>true</code>, if the model
-     * is armed. If the model is not armed, ignore the event.
-     *
-     * @param e The mouse release event to accept
-     */
-    public void mouseReleased(MouseEvent e)
+  protected void uninstallKeyboardActions(AbstractButton b)
     {
-      // System.err.println("ButtonUI :: mouse released");
-      if (button.getModel().isArmed()
-          && (e.getModifiers() & InputEvent.BUTTON1_MASK) != 0)
-        {
-          button.getModel().setPressed(true);
-        }
-    }
   }
 
   /**
@@ -218,19 +154,13 @@
     public void installUI(final JComponent c) 
     {
        super.installUI(c);
-
-       textColor                = new Color(0,0,0);
-       disabledTextColor        = new Color(130, 130, 130);
-       pressedBackgroundColor   = new Color(150,150,150);
-       pressedBackgroundColor   = new Color(150,150,150);
-       normalBackgroundColor    = new Color(192,192,192);
-
-    // this tells the border (if we have one) how to paint.
-    c.setBackground(normalBackgroundColor);
-    ((AbstractButton)c).setMargin (new Insets(10,10,10,10));
-
-    c.addMouseListener(new ButtonUIListener((AbstractButton) c));
-    c.addFocusListener(new FocusUIListener((AbstractButton) c));
+    if (c instanceof AbstractButton)
+      {
+        AbstractButton b = (AbstractButton) c;
+        installDefaults(b);
+        installListeners(b);
+        installKeyboardActions(b);
+      }
   }
 
   /**
@@ -244,10 +174,42 @@
     public Dimension getPreferredSize(JComponent c) 
     {
        AbstractButton b = (AbstractButton)c;
-       Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, gap);
+    Dimension d = 
+      BasicGraphicsUtils.getPreferredButtonSize
+      (b, defaultTextIconGap + defaultTextShiftOffset);
        return d;
     }
     
+  static private Icon currentIcon(AbstractButton b)
+  {
+    Icon i = b.getIcon();
+    ButtonModel model = b.getModel();
+
+    if (model.isPressed() && b.getPressedIcon() != null)
+      i = b.getPressedIcon();
+
+    else if (model.isRollover())
+      {
+        if (b.isSelected() && b.getRolloverSelectedIcon() != null)
+          i = b.getRolloverSelectedIcon();
+        else if (b.getRolloverIcon() != null)
+          i = b.getRolloverIcon();
+      }    
+
+    else if (b.isSelected())
+      {
+        if (b.isEnabled() && b.getSelectedIcon() != null)
+          i = b.getSelectedIcon();
+        else if (b.getDisabledSelectedIcon() != null)
+          i = b.getDisabledSelectedIcon();
+      }
+
+    else if (! b.isEnabled() && b.getDisabledIcon() != null)
+      i = b.getDisabledIcon();
+
+    return i;
+  }
+
   /**
    * Paint the component, which is an address@hidden AbstractButton}, 
according to 
    * its current state.
@@ -268,31 +230,21 @@
 
         g.setFont(f);
 
-        FontMetrics fm = g.getFontMetrics(f);
-
-    Insets border = b.getInsets();
-    Insets margin = b.getMargin();
-
-    br.x = border.left;
-    br.y = border.top;
-    br.width = b.getWidth() - (border.right + border.left);
-    br.height = b.getHeight() - (border.top + border.bottom);
-
-    vr.x = br.x + margin.left;
-    vr.y = br.y + margin.top;
-    vr.width = br.width - (margin.right + margin.left);
-    vr.height = br.height - (margin.top + margin.bottom);
-
-    String text = SwingUtilities.layoutCompoundLabel(c, fm, b.getText(),
-                                                        b.getIcon(),
+    SwingUtilities.calculateInnerArea(b, br);
+    SwingUtilities.calculateInsetArea(br, b.getMargin(), vr);    
+    String text = SwingUtilities.layoutCompoundLabel(c, g.getFontMetrics(f), 
+                                                     b.getText(),
+                                                     currentIcon(b),
                                                         
b.getVerticalAlignment(), 
                                                         
b.getHorizontalAlignment(),
                                                         
b.getVerticalTextPosition(), 
                                                         
b.getHorizontalTextPosition(),
-                                                     vr, ir, tr, gap);
+                                                     vr, ir, tr, 
+                                                     defaultTextIconGap 
+                                                     + defaultTextShiftOffset);
 
-    if ((b.getModel().isRollover() && b.getModel().isArmed()) 
-        || b.getModel().isSelected())
+    if ((b.getModel().isArmed() && b.getModel().isPressed()) 
+        || b.isSelected())
       paintButtonPressed(g, br, c);
        else
       paintButtonNormal(g, br, c);
@@ -354,11 +306,13 @@
   protected void paintIcon(Graphics g, JComponent c, Rectangle iconRect)
     {
        AbstractButton b = (AbstractButton) c;
-       if (b.getIcon() != null)
+    Icon i = currentIcon(b);
+
+    if (i != null)
            {
                int x = iconRect.x;
                int y = iconRect.y;
-               b.getIcon().paintIcon(c, g, x, y);
+        i.paintIcon(c, g, x, y);
            }
     }
 
@@ -373,11 +327,12 @@
    */
   protected void paintButtonPressed(Graphics g, Rectangle area, JComponent b)
     {
-       Dimension size = b.getSize();
-       
-       g.setColor(pressedBackgroundColor);
+    if (((AbstractButton)b).isContentAreaFilled())
+      {
+        g.setColor(b.getBackground().darker());
     g.fillRect(area.x, area.y, area.width, area.height);
     }
+  }
     
   /**
    * Paints the background area of an address@hidden AbstractButton} in the 
normal,
@@ -390,10 +345,12 @@
    */
   protected void paintButtonNormal(Graphics g, Rectangle area, JComponent b)
     {
-       Dimension size = b.getSize();
-       g.setColor(normalBackgroundColor);
+    if (((AbstractButton)b).isContentAreaFilled())
+      {
+        g.setColor(b.getBackground());
     g.fillRect(area.x, area.y, area.width, area.height);
     }
+  }
     
   /**
    * Paints the "text" property of an address@hidden AbstractButton}, using the
@@ -410,9 +367,8 @@
        Font f = c.getFont();
         g.setFont(f);
         FontMetrics fm = g.getFontMetrics(f);
-       g.setColor(c.isEnabled() ? textColor : disabledTextColor);
-    BasicGraphicsUtils.drawString(g, text, 
-                                     0,
+    g.setColor(c.getForeground());
+    BasicGraphicsUtils.drawString(g, text, 0,
                                      textRect.x, 
                                   textRect.y + fm.getAscent());
     } 
--- javax/swing/plaf/basic/BasicCheckBoxUI.java 10 Jan 2004 21:59:30 -0000      
1.4
+++ javax/swing/plaf/basic/BasicCheckBoxUI.java 10 Feb 2004 04:19:08 -0000
@@ -38,81 +38,27 @@
 
 package javax.swing.plaf.basic;
 
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Rectangle;
-import javax.swing.AbstractButton;
+import javax.swing.Icon;
 import javax.swing.JComponent;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
 import javax.swing.plaf.ComponentUI;
 
 public class BasicCheckBoxUI extends BasicRadioButtonUI
 {  
+  
     public static ComponentUI createUI(final JComponent c)  {
        return new BasicCheckBoxUI();
     }
 
-    
-    public void installUI(final JComponent c)  {
-       super.installUI(c);
-    }
-    
-    public Dimension getPreferredSize(JComponent c) 
-    {
-       AbstractButton b = (AbstractButton)c;
-       Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, gap);
-       //System.out.println("^^^^^^^^^^^^^^^^^^^^^^   BASIC-PREF="+d + 
",T="+b.text);
-       return d;
-    }
-    
-    protected void paintFocus(Graphics g, 
-                             JComponent c,
-                             Rectangle vr,
-                             Rectangle tr,
-                             Rectangle ir)
-    {
-    }
-
-    protected void paintIcon(Graphics g, 
-                            JComponent c, 
-                            Rectangle iconRect)
-    {
-    }
-
-    protected void paintButtonPressed(Graphics g,
-                                     JComponent b)
+  public Icon getDefaultIcon()
     {
-       Dimension size = b.getSize();
-       
-       g.setColor(pressedBackgroundColor);
-       g.fillRect(1,1,size.width-2, size.height-2);                
-
+    UIDefaults defaults = UIManager.getLookAndFeelDefaults();
+    return defaults.getIcon("CheckBox.icon");
     }
     
-    protected void paintButtonNormal(Graphics g,
-                                    JComponent b)
-    {
-       Dimension size = b.getSize();
-       
-       g.setColor(normalBackgroundColor);
-       g.fillRect(1,1,size.width-2, size.height-2);                
-
-    }
-    protected void paintText(Graphics g,
-                            JComponent c,
-                            Rectangle textRect,
-                            String text) 
-    {
-       //        AbstractButton b = (AbstractButton) c;
-       
-       //      System.out.println("drawing string: " + text + ", at:" + 
textRect);
-       
-       g.setColor(textColor);
-       BasicGraphicsUtils.drawString(g,
-                                     text, 
-                                     0,
-                                     textRect.x, 
-                                     textRect.y);
+  public void installUI(final JComponent c)  {
+    super.installUI(c);
     } 
 }
 
--- javax/swing/plaf/basic/BasicIconFactory.java        10 May 2003 08:14:36 
-0000      1.2
+++ javax/swing/plaf/basic/BasicIconFactory.java        10 Feb 2004 04:19:08 
-0000
@@ -39,7 +39,14 @@
 package javax.swing.plaf.basic;
 
 import java.io.Serializable;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Polygon;
+import javax.swing.AbstractButton;
 import javax.swing.Icon;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
 /**
  * STUBBED
  */
@@ -47,39 +54,156 @@
 {
   static final long serialVersionUID = 5605588811185324383L;
 
+  static private class DummyIcon 
+    implements Icon
+  {    
+    public int getIconHeight() { return 10; }
+    public int getIconWidth() { return 10; }
+    public void paintIcon(Component c, Graphics g, int x, int y)
+    {
+      Color save = g.getColor();
+      g.setColor(c.getForeground());
+      g.drawRect(x, y, 10, 10);
+      g.setColor(save);
+    }
+  }
+
+
   public BasicIconFactory()
   {
   }
   public static Icon getMenuItemCheckIcon()
   {
-    return null;
+    return new DummyIcon();
   }
   public static Icon getMenuItemArrowIcon()
   {
-    return null;
+    return new DummyIcon();
   }
   public static Icon getMenuArrowIcon()
   {
-    return null;
+    return new DummyIcon();
   }
+
   public static Icon getCheckBoxIcon()
   {
-    return null;
+    return new Icon()
+      {        
+        public int getIconHeight() 
+        { 
+          return 10; 
+        }
+        public int getIconWidth() 
+        { 
+          return 10; 
+        }
+        public void paintIcon(Component c, Graphics g, int x, int y)
+        {
+          if (c instanceof AbstractButton)
+            {
+              UIDefaults defaults;
+              defaults = UIManager.getLookAndFeelDefaults();
+              Color hi = defaults.getColor("CheckBox.highlight");
+              Color low = defaults.getColor("CheckBox.darkShadow");
+              Color sel = defaults.getColor("CheckBox.foreground");
+              Color dim = defaults.getColor("CheckBox.shadow");
+              Polygon check = new Polygon(new int[] {x+3, x+3, x+8},
+                                          new int[] {y+5, y+9, y+3}, 3);
+              AbstractButton b = (AbstractButton) c;
+              Color saved = g.getColor();
+              if (b.isEnabled())
+                {
+                  g.setColor(low);
+                  g.drawRect(x, y, 10, 10);
+                  g.setColor(hi);
+                  g.drawRect(x+1, y+1, 10, 10);
+                  if (b.isSelected())
+                    {
+                      g.setColor(sel);
+                      if (b.isSelected())
+                        {
+                          g.drawLine(x+3, y+5, x+3, y+8);
+                          g.drawLine(x+4, y+5, x+4, y+8);
+                          g.drawLine(x+3, y+8, x+8, y+3);
+                          g.drawLine(x+4, y+8, x+8, y+3);
+                        }
+                    }
+                }
+              else
+                {                  
+                  g.setColor(hi);
+                  g.drawRect(x, y, 10, 10);
+                  if (b.isSelected())
+                    {
+                      g.drawLine(x+3, y+5, x+3, y+9);
+                      g.drawLine(x+3, y+9, x+8, y+3);
   }
+                }
+              g.setColor(saved);
+            }
+        }
+      };
+  }
+
   public static Icon getRadioButtonIcon()
   {
-    return null;
+    return new Icon()
+      {        
+        public int getIconHeight() 
+        { 
+          return 12; 
+        }
+        public int getIconWidth() 
+        { 
+          return 12; 
+        }
+        public void paintIcon(Component c, Graphics g, int x, int y)
+        {
+          UIDefaults defaults;      
+          defaults = UIManager.getLookAndFeelDefaults();
+          Color hi = defaults.getColor("RadioButton.highlight");
+          Color low = defaults.getColor("RadioButton.darkShadow");
+          Color sel = defaults.getColor("RadioButton.foreground");
+          Color dim = defaults.getColor("RadioButton.shadow");
+
+          if (c instanceof AbstractButton)
+            {
+              AbstractButton b = (AbstractButton) c;
+              Color saved = g.getColor();
+              if (b.isEnabled())
+                {
+                  g.setColor(low);
+                  g.drawOval(x, y, 12, 12);
+                  g.setColor(hi);
+                  g.drawOval(x+1, y+1, 12, 12);
+                  if (b.isSelected())
+                    {
+                      g.setColor(sel);
+                      g.fillOval(x+4, y+4, 6, 6);
+                    }
+                }
+              else
+                {                  
+                  g.setColor(hi);
+                  g.drawOval(x, y, 12, 12);
+                  if (b.isSelected())
+                    g.fillOval(x+4, y+4, 6, 6);
+                }
+              g.setColor(saved);
+            }
+        }
+      };
   }
   public static Icon getCheckBoxMenuItemIcon()
   {
-    return null;
+    return new DummyIcon();
   }
   public static Icon getRadioButtonMenuItemIcon()
   {
-    return null;
+    return new DummyIcon();
   }
   public static Icon createEmptyFrameIcon()
   {
-    return null;
+    return new DummyIcon();
   }
 } // class BasicIconFactory
--- javax/swing/plaf/basic/BasicLookAndFeel.java        13 Jul 2003 15:29:11 
-0000      1.3
+++ javax/swing/plaf/basic/BasicLookAndFeel.java        10 Feb 2004 04:19:08 
-0000
@@ -227,29 +227,40 @@
   {
     Object[] uiDefaults;
     uiDefaults = new Object[] {
+
+      "AbstractUndoableEdit.undoText", "Undo",
+      "AbstractUndoableEdit.redoText", "Redo",
+
       "Button.background", new ColorUIResource(Color.lightGray),
-      "Button.border", new BorderUIResource.CompoundBorderUIResource(null,
-                                                                     null),
+      "Button.border", BorderUIResource.getEtchedBorderUIResource(),
+      "Button.darkShadow", new ColorUIResource(Color.darkGray),
       "Button.focusInputMap", new UIDefaults.LazyInputMap(new Object[] {
         "SPACE",  "pressed",
         "released SPACE", "released"
       }),
       "Button.font", new FontUIResource("Dialog", Font.PLAIN, 12),
       "Button.foreground", new ColorUIResource(Color.black),
+      "Button.highlight", new ColorUIResource(Color.white),
+      "Button.light", new ColorUIResource(Color.lightGray.brighter()),
       "Button.margin", new InsetsUIResource(2, 14, 2, 14),
+      "Button.shadow", new ColorUIResource(Color.gray),
       "Button.textIconGap", new Integer(4),
       "Button.textShiftOffset", new Integer(0),
       "CheckBox.background", new ColorUIResource(Color.lightGray),
       "CheckBox.border", new BorderUIResource.CompoundBorderUIResource(null,
                                                                        null),
+      "CheckBox.darkShadow", new ColorUIResource(Color.darkGray),
       "CheckBox.focusInputMap", new UIDefaults.LazyInputMap(new Object[] {
         "SPACE",  "pressed",
         "released SPACE", "released"
       }),
       "CheckBox.font", new FontUIResource("Dialog", Font.PLAIN, 12),
       "CheckBox.foreground", new ColorUIResource(Color.black),
+      "CheckBox.highlight", new ColorUIResource(Color.white),
       "CheckBox.icon", BasicIconFactory.getCheckBoxIcon(),
+      "CheckBox.light", new ColorUIResource(Color.lightGray.brighter()),
       "CheckBox.margin",new InsetsUIResource(2, 2, 2, 2),
+      "CheckBox.shadow", new ColorUIResource(Color.gray),
       "CheckBox.textIconGap", new Integer(4),
       "CheckBox.textShiftOffset", new Integer(0),
       "CheckBoxMenuItem.acceleratorFont", new FontUIResource("Dialog",
@@ -540,7 +551,7 @@
       "PopupMenu.font", new FontUIResource("Dialog", Font.PLAIN, 12),
       "PopupMenu.foreground", new ColorUIResource(Color.black),
       "ProgressBar.background", new ColorUIResource(Color.lightGray),
-      "ProgressBar.border", new BorderUIResource.LineBorderUIResource(null),
+      "ProgressBar.border", new 
BorderUIResource.LineBorderUIResource(Color.darkGray),
       "ProgressBar.cellLength", new Integer(1),
       "ProgressBar.cellSpacing", new Integer(0),
       "ProgressBar.font", new FontUIResource("Dialog", Font.PLAIN, 12),
@@ -550,14 +561,18 @@
       "RadioButton.background", new ColorUIResource(Color.lightGray),
       "RadioButton.border", new BorderUIResource.CompoundBorderUIResource(null,
                                                                           
null),
+      "RadioButton.darkShadow", new ColorUIResource(Color.darkGray),
       "RadioButton.focusInputMap", new UIDefaults.LazyInputMap(new Object[] {
         "SPACE",  "pressed",
         "released SPACE", "released"
       }),
       "RadioButton.font", new FontUIResource("Dialog", Font.PLAIN, 12),
       "RadioButton.foreground", new ColorUIResource(Color.black),
+      "RadioButton.highlight", new ColorUIResource(Color.white),
       "RadioButton.icon", BasicIconFactory.getRadioButtonIcon(),
+      "RadioButton.light", new ColorUIResource(Color.lightGray.brighter()),
       "RadioButton.margin", new InsetsUIResource(2, 2, 2, 2),
+      "RadioButton.shadow", new ColorUIResource(Color.gray),
       "RadioButton.textIconGap", new Integer(4),
       "RadioButton.textShiftOffset", new Integer(0),
       "RadioButtonMenuItem.acceleratorFont", new FontUIResource("Dialog",
@@ -742,7 +757,7 @@
       "Table.background", new ColorUIResource(Color.white),
       "Table.focusCellBackground", new ColorUIResource(Color.white),
       "Table.focusCellForeground", new ColorUIResource(Color.black),
-      "Table.focusCellHighlightBorder", new 
BorderUIResource.LineBorderUIResource(null),
+      "Table.focusCellHighlightBorder", new 
BorderUIResource.LineBorderUIResource(Color.white),
       "Table.font", new FontUIResource("Dialog", Font.PLAIN, 12),
       "Table.foreground", new ColorUIResource(Color.black),
       "Table.gridColor", new ColorUIResource(Color.gray),
@@ -849,7 +864,7 @@
       "ToolBar.foreground", new ColorUIResource(Color.black),
       "ToolBar.separatorSize", new DimensionUIResource(10, 10),
       "ToolTip.background", new ColorUIResource(Color.white),
-      "ToolTip.border", new BorderUIResource.LineBorderUIResource(null),
+      "ToolTip.border", new 
BorderUIResource.LineBorderUIResource(Color.lightGray),
       "ToolTip.font", new FontUIResource("SansSerif", Font.PLAIN, 12),
       "ToolTip.foreground", new ColorUIResource(Color.black),
       "Tree.ancestorInputMap", new UIDefaults.LazyInputMap(new Object[] {
@@ -860,7 +875,7 @@
       // XXX Don't use gif
       "Tree.closedIcon", new IconUIResource(new 
ImageIcon("icons/TreeClosed.gif")),
       "Tree.drawsFocusBorderAroundIcon", Boolean.FALSE,
-      "Tree.editorBorder", new BorderUIResource.LineBorderUIResource(null),
+      "Tree.editorBorder", new 
BorderUIResource.LineBorderUIResource(Color.lightGray),
       "Tree.focusInputMap", new UIDefaults.LazyInputMap(new Object[] {
         "shift PAGE_DOWN", "scrollDownExtendSelection",
         "PAGE_DOWN", "scrollDownChangeSelection",
--- javax/swing/plaf/basic/BasicPanelUI.java    10 Jan 2004 21:59:30 -0000      
1.3
+++ javax/swing/plaf/basic/BasicPanelUI.java    10 Feb 2004 04:19:08 -0000
@@ -44,8 +44,6 @@
 
 public class BasicPanelUI extends PanelUI
 {
-    int gap = 3;
-
     public static ComponentUI createUI(JComponent x) 
     {
         return new BasicPanelUI();
--- javax/swing/plaf/basic/BasicRadioButtonUI.java      10 Jan 2004 21:59:30 
-0000      1.4
+++ javax/swing/plaf/basic/BasicRadioButtonUI.java      10 Feb 2004 04:19:08 
-0000
@@ -38,116 +38,42 @@
 
 package javax.swing.plaf.basic;
 
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Rectangle;
 import javax.swing.AbstractButton;
+import javax.swing.Icon;
 import javax.swing.JComponent;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
 import javax.swing.plaf.ComponentUI;
 
 public class BasicRadioButtonUI extends BasicToggleButtonUI
 {
-  int large_circle_width = 20;
-  int circle_width = large_circle_width - 8; // FIXME: sun == ?
+
+  protected Icon icon;
   
     public static ComponentUI createUI(final JComponent c)  {
        return new BasicRadioButtonUI();
     }
 
+  public BasicRadioButtonUI()
+  {
+    icon = getDefaultIcon();
+  }
     
     public void installUI(final JComponent c)  {
        super.installUI(c);
-    }
-    
-    public Dimension getPreferredSize(JComponent c) 
+    if (c instanceof AbstractButton)
     {
        AbstractButton b = (AbstractButton)c;
-       Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, gap);
-       
-       // and add a little something for the circles:
-
-       d.width += large_circle_width;
-       d.height = Math.max(large_circle_width, d.height);
-       
-       //System.out.println("^^^^^^^^^^^^^^^^^^^^^^   BASIC-PREF="+d + 
",T="+b.text);
-       return d;
+        b.setIcon(icon);
     }
-    
-    protected void paintFocus(Graphics g, 
-                             JComponent c,
-                             Rectangle vr,
-                             Rectangle tr,
-                             Rectangle ir)
-    {
-    }
-
-    protected void paintIcon(Graphics g, 
-                            JComponent c, 
-                            Rectangle iconRect)
-    {
-    }
-
-    protected void paintButtonPressed(Graphics g,
-                                     JComponent b)
-    {
-       Dimension size = b.getSize();
-       
-       paintButtonNormal(g, b);
-
-       int x = gap;
-       int y = gap;
-
-       int diffp = 2;
-       int diff = 3;
-       
-       g.setColor(textColor);
-       g.fillArc(x+diffp, y+diffp, 
-                 circle_width-diff, circle_width-diff,
-                 0, 360);
     }
     
-    protected void paintButtonNormal(Graphics g,
-                                    JComponent c)
+  public Icon getDefaultIcon()
     {
-       AbstractButton b = (AbstractButton) c;
-       
-       Dimension size = b.getSize();
-       
-       g.setColor(normalBackgroundColor);
-       g.fillRect(1,1,size.width-2, size.height-2);  
-       
-       int x = gap;
-       int y = gap;
-       
-       g.setColor(pressedBackgroundColor);
-       g.drawArc(x, y,
-                 circle_width, circle_width,
-                 0, 360);
-
-       g.setColor(new Color(255,255,255));
-       g.drawArc(x, y,
-                 circle_width+1, circle_width+1,
-                 145, 160);
+    UIDefaults defaults = UIManager.getLookAndFeelDefaults();
+    return defaults.getIcon("RadioButton.icon");
     }
     
-    protected void paintText(Graphics g,
-                            JComponent c,
-                            Rectangle textRect,
-                            String text) 
-    {
-       //        AbstractButton b = (AbstractButton) c;
-       
-       //System.out.println("drawing string: " + text + ", " + c.isEnabled());
-       
-       g.setColor(c.isEnabled() ? textColor : disabledTextColor);
-       
-       BasicGraphicsUtils.drawString(g,
-                                     text, 
-                                     0,
-                                     textRect.x + circle_width + gap, 
-                                     textRect.y);
-    } 
 }
 
 
--- javax/swing/plaf/basic/BasicToggleButtonUI.java     10 Jan 2004 21:59:30 
-0000      1.4
+++ javax/swing/plaf/basic/BasicToggleButtonUI.java     10 Feb 2004 04:19:08 
-0000
@@ -51,71 +51,6 @@
     public static ComponentUI createUI(final JComponent c)  {
        return new BasicToggleButtonUI();
     }
-
-    
-    public void installUI(final JComponent c)  {
-       super.installUI(c);
-    }
-    
-    public Dimension getPreferredSize(JComponent c) 
-    {
-       AbstractButton b = (AbstractButton)c;
-       Dimension d = BasicGraphicsUtils.getPreferredButtonSize(b, gap);
-                                                         
-       //System.out.println("^^^^^^^^^^^^^^^^^^^^^^   BASIC-PREF="+d + 
",T="+b.text);
-       return d;
-    }
-    
-    protected void paintFocus(Graphics g, 
-                             JComponent c,
-                             Rectangle vr,
-                             Rectangle tr,
-                             Rectangle ir)
-    {
-    }
-
-    protected void paintIcon(Graphics g, 
-                            JComponent c, 
-                            Rectangle iconRect)
-    {
-    }
-
-    protected void paintButtonPressed(Graphics g,
-                                     JComponent b)
-    {
-       Dimension size = b.getSize();
-       
-       g.setColor(pressedBackgroundColor);
-       g.fillRect(1,1,size.width-2, size.height-2);                
-
-    }
-    
-    protected void paintButtonNormal(Graphics g,
-                                    JComponent b)
-    {
-       Dimension size = b.getSize();
-       
-       g.setColor(normalBackgroundColor);
-       g.fillRect(1,1,size.width-2, size.height-2);                
-
-    }
-    protected void paintText(Graphics g,
-                            JComponent c,
-                            Rectangle textRect,
-                            String text) 
-    {
-       //        AbstractButton b = (AbstractButton) c;
-       
-       //      System.out.println("drawing string: " + text + ", at:" + 
textRect);
-       
-       g.setColor(textColor);
-
-       BasicGraphicsUtils.drawString(g,
-                                     text, 
-                                     0,        
-                                     textRect.x, 
-                                     textRect.y);
-    } 
 }
 
 
--- javax/swing/plaf/metal/MetalLookAndFeel.java        12 Oct 2003 13:26:01 
-0000      1.4
+++ javax/swing/plaf/metal/MetalLookAndFeel.java        10 Feb 2004 04:19:08 
-0000
@@ -40,7 +40,6 @@
 package javax.swing.plaf.metal;
 
 import javax.swing.UIDefaults;
-import javax.swing.plaf.basic.BasicDefaults;
 import javax.swing.plaf.basic.BasicLookAndFeel;
 
 public class MetalLookAndFeel extends BasicLookAndFeel
@@ -61,7 +60,7 @@
      public UIDefaults getDefaults()
         {
           if (LAF_defaults == null)
-            LAF_defaults = new BasicDefaults();
+            LAF_defaults = super.getDefaults();
             
             //      Returns the default values for this look and feel. 
             return LAF_defaults;
--- javax/swing/text/JTextComponent.java        24 Jun 2003 09:51:28 -0000      
1.3
+++ javax/swing/text/JTextComponent.java        10 Feb 2004 04:19:08 -0000
@@ -406,7 +406,7 @@
     public String getUIClassID()
     {
        //          Returns a string that specifies the name of the l&f class 
that renders this component.  
-       return "JTextComponent";
+       return "TextComponentUI";
     }
     public int getVerticalAlignment()
     {
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c    8 Oct 2003 23:38:45 
-0000       1.4
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c    10 Feb 2004 04:19:08 
-0000
@@ -316,12 +316,24 @@
   (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
 {
   struct graphics *g;
+  GdkGCValues saved;
 
   g = (struct graphics *) NSA_GET_PTR (env, obj);
 
   gdk_threads_enter ();
+  if (GDK_IS_WINDOW (g->drawable))
+    {
   gdk_window_clear_area ((GdkWindow *)g->drawable, 
                         x + g->x_offset, y + g->y_offset, width, height);
+    }
+  else
+    {
+      gdk_gc_get_values (g->gc, &saved);
+      gdk_gc_set_foreground (g->gc, &(saved.background));
+      gdk_draw_rectangle (g->drawable, g->gc, TRUE, 
+                         x + g->x_offset, y + g->y_offset, width, height);
+      gdk_gc_set_foreground (g->gc, &(saved.foreground));
+    }
   gdk_threads_leave ();
 }
 
--- javax/swing/plaf/basic/BasicButtonListener.java
+++ javax/swing/plaf/basic/BasicButtonListener.java
@@ -0,0 +1,188 @@
+/* BasicButtonListener.java
+   Copyright (C) 2004 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package javax.swing.plaf.basic;
+
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.AbstractButton;
+import javax.swing.ButtonModel;
+import javax.swing.UIDefaults;
+import javax.swing.UIManager;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.JComponent;
+
+public class BasicButtonListener
+  implements MouseListener, MouseMotionListener, FocusListener, 
+             ChangeListener, PropertyChangeListener
+{
+  public void propertyChange(PropertyChangeEvent e)
+  {
+  }
+  protected void checkOpacity(AbstractButton b) 
+  {    
+  }
+  public void focusGained(FocusEvent e) 
+  {    
+  }
+
+  public void focusLost(FocusEvent e)
+  {
+    if (e.getSource() instanceof AbstractButton)
+      {
+        AbstractButton button = (AbstractButton) e.getSource();
+        ButtonModel model = button.getModel();
+        model.setArmed(false);
+      }
+  }
+  public void installKeyboardActions(JComponent c)
+  {
+  }
+  public void uninstallKeyboardActions(JComponent c)
+  {
+  }
+  public void stateChanged(ChangeEvent e)
+  {
+  }
+  public void mouseMoved(MouseEvent e)
+  {
+    System.err.println("button got mouse move");
+  }
+  public void mouseDragged(MouseEvent e)
+  {
+    System.err.println("button got mouse drag");
+  }
+  public void mouseClicked(MouseEvent e)
+  {
+    System.err.println("button got mouse click");
+  }
+
+  /**
+   * Accept a mouse press event and arm the button.
+   *
+   * @param e The mouse press event to accept
+   */
+  public void mousePressed(MouseEvent e)
+  {
+    if (e.getSource() instanceof AbstractButton)
+      {
+        AbstractButton button = (AbstractButton) e.getSource();
+        ButtonModel model = button.getModel();
+        if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0)
+          {
+            // It is important that these transitions happen in this order.
+            model.setArmed(true);
+            model.setPressed(true);
+          }
+      }
+  }
+
+
+  /**
+   * Accept a mouse release event and set the button's 
+   * "pressed" property to <code>true</code>, if the model
+   * is armed. If the model is not armed, ignore the event.
+   *
+   * @param e The mouse release event to accept
+   */
+  public void mouseReleased(MouseEvent e)
+  {
+    if (e.getSource() instanceof AbstractButton)
+      {
+        AbstractButton button = (AbstractButton) e.getSource();
+        ButtonModel model = button.getModel();
+        if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0)
+          {
+            // It is important that these transitions happen in this order.
+            model.setPressed(false);
+            model.setArmed(false);
+          }
+      }
+  }
+
+
+  /**
+   * Accept a mouse enter event and set the button's "rollover" property to
+   * <code>true</code>, if the button's "rolloverEnabled" property is
+   * <code>true</code>. If the button is currently armed and the mouse
+   * button is not held down, this enter event will also disarm the model.
+   *
+   * @param e The mouse enter event to accept
+   */
+  public void mouseEntered(MouseEvent e)
+  {
+    if (e.getSource() instanceof AbstractButton)
+      {
+        AbstractButton button = (AbstractButton) e.getSource();
+        ButtonModel model = button.getModel();
+        if (button.isRolloverEnabled())
+          model.setRollover(true);
+        
+        if (model.isPressed() 
+            && (e.getModifiers() & InputEvent.BUTTON1_MASK) != 0)
+          model.setArmed(true);
+        else
+          model.setArmed(false);
+      }
+  }
+
+  /**
+   * Accept a mouse exit event and set the button's model's "rollover"
+   * property to <code>false</code>, if it's "rolloverEnabled" property is
+   * <code>true</code>. Also disarm the button.
+   *
+   * @param e The mouse exit event to accept
+   */
+  public void mouseExited(MouseEvent e)
+  {
+    if (e.getSource() instanceof AbstractButton)
+      {
+        AbstractButton button = (AbstractButton) e.getSource();
+        ButtonModel model = button.getModel();
+        if (button.isRolloverEnabled())
+          model.setRollover(false);
+        model.setArmed(false);
+      }
+  }
+}
--- javax/swing/plaf/basic/BasicRootPaneUI.java
+++ javax/swing/plaf/basic/BasicRootPaneUI.java
@@ -0,0 +1,57 @@
+/* BasicPanelUI.java
+   Copyright (C) 2002 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.swing.plaf.basic;
+
+import javax.swing.*;
+import javax.swing.plaf.*;
+import java.awt.*;
+
+
+public class BasicRootPaneUI extends RootPaneUI
+{
+    public static ComponentUI createUI(JComponent x) 
+    {
+        return new BasicRootPaneUI();
+    }
+
+    public void installUI(JComponent c)
+    {
+      super.installUI(c);
+    }
+}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]