classpath-patches
[Top][All Lists]
Advanced

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

[cp-patches] FYI: MetalComboBoxButton and MetalComboBoxEditor


From: David Gilbert
Subject: [cp-patches] FYI: MetalComboBoxButton and MetalComboBoxEditor
Date: Tue, 13 Sep 2005 22:39:10 +0000
User-agent: Mozilla Thunderbird 1.0.6 (X11/20050728)

I committed these new classes. The MetalComboBoxUI class that uses them isn't complete yet, but I'm working on it:

2005-09-13  David Gilbert  <address@hidden>

        * javax/swing/plaf/metal/MetalComboBoxButton.java: new file,
        * javax/swing/plaf/metal/MetalComboBoxEditor.java: likewise.

Regards,

Dave
Index: javax/swing/plaf/metal/MetalComboBoxButton.java
===================================================================
RCS file: javax/swing/plaf/metal/MetalComboBoxButton.java
diff -N javax/swing/plaf/metal/MetalComboBoxButton.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ javax/swing/plaf/metal/MetalComboBoxButton.java     13 Sep 2005 21:33:01 
-0000
@@ -0,0 +1,236 @@
+/* MetalComboBoxButton.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., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 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.metal;
+
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Insets;
+import java.awt.Rectangle;
+
+import javax.swing.CellRendererPane;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JList;
+import javax.swing.SwingUtilities;
+
+/**
+ * A button used by the address@hidden MetalComboBoxUI} class.
+ */
+public class MetalComboBoxButton extends JButton {
+
+  /** A reference to the JComboBox that the button belongs to. */
+  protected JComboBox comboBox;
+
+  /** A reference to the JList. */
+  protected JList listBox;
+  
+  /** ??? */
+  protected CellRendererPane rendererPane;
+  
+  /** The button icon. */
+  protected Icon comboIcon;
+  
+  /** Display just the icon, or the icon plus the label. */
+  protected boolean iconOnly;
+  
+  /**
+   * Creates a new button.
+   * 
+   * @param cb  the combo that the button is used for (<code>null</code> not 
+   *            permitted).
+   * @param i  the icon displayed on the button.
+   * @param pane  the rendering pane.
+   * @param list  the list.
+   */
+  public MetalComboBoxButton(JComboBox cb, Icon i, CellRendererPane pane,
+      JList list)
+  {
+    this(cb, i, cb.isEditable(), pane, list);  
+  }
+  
+  /**
+   * Creates a new button.
+   * 
+   * @param cb  the combo that the button is used for (<code>null</code> not 
+   *            permitted).
+   * @param i  the icon displayed on the button.
+   * @parma onlyIcon  a flag that specifies whether the button displays only an
+   *                  icon, or text as well.
+   * @param pane  the rendering pane.
+   * @param list  the list.
+   */
+  public MetalComboBoxButton(JComboBox cb, Icon i, boolean onlyIcon,
+      CellRendererPane pane, JList list)
+  {
+    super(i);
+    comboBox = cb;
+    comboIcon = i;
+    iconOnly = onlyIcon;
+    listBox = list;
+    rendererPane = pane;
+  }
+  
+  /**
+   * Returns the combo box that the button is used with.
+   * 
+   * @return The combo box.
+   */
+  public final JComboBox getComboBox()
+  {
+    return comboBox;
+  }
+  
+  /**
+   * Sets the combo box that the button is used with.
+   * 
+   * @param cb  the combo box.
+   */
+  public final void setComboBox(JComboBox cb)
+  {
+    comboBox = cb;
+  }
+  
+  /**
+   * Returns the icon displayed by the button.  By default, this will be an
+   * instance of address@hidden MetalComboBoxIcon}.
+   * 
+   * @return The icon displayed by the button.
+   */
+  public final Icon getComboIcon()
+  {
+    return comboIcon;
+  }
+  
+  /**
+   * Sets the icon displayed by the button.
+   * 
+   * @param i  the icon.
+   */
+  public final void setComboIcon(Icon i)
+  {
+    comboIcon = i;
+  }
+  
+  /**
+   * Returns a flag that controls whether the button displays an icon only,
+   * or text as well.
+   * 
+   * @return A boolean.
+   */
+  public final boolean isIconOnly()
+  {
+    return iconOnly;
+  }
+  
+  /**
+   * Sets the flag that controls whether the button displays an icon only,
+   * or text as well.
+   * 
+   * @param isIconOnly  the flag.
+   */
+  public final void setIconOnly(boolean isIconOnly)
+  {
+    iconOnly = isIconOnly;
+  }
+  
+  /**
+   * Returns <code>false</code>, to indicate that this component is not part
+   * of the focus traversal group.
+   * 
+   * @return <code>false</code>
+   */
+  public boolean isFocusTraversable()
+  {
+    return false;
+  }
+  
+  /**
+   * Enables or disables the button.
+   * 
+   * @param enabled  the new status.
+   */
+  public void setEnabled(boolean enabled)
+  {
+    super.setEnabled(enabled);
+    // TODO: figure out what this might need to be used for
+    // perhaps it has something to do with the button's icon and/or border?
+  }
+  
+  /**
+   * Paints the component.
+   * 
+   * @param g  the graphics device.
+   */
+  public void paintComponent(Graphics g)
+  {
+    if (iconOnly)
+      {
+        Rectangle bounds = getBounds();
+        int x = (bounds.width - comboIcon.getIconWidth()) / 2;
+        int y = (bounds.height - comboIcon.getIconHeight()) / 2;
+        comboIcon.paintIcon(comboBox, g, x, y);  
+      }
+    else
+      {
+        String text = comboBox.getModel().getSelectedItem().toString();
+        Rectangle bounds = comboBox.getBounds();
+        Rectangle innerArea = SwingUtilities.calculateInnerArea(this, null);
+        if (comboBox.hasFocus())
+          {
+            g.setColor(MetalLookAndFeel.getFocusColor());
+            g.drawRect(innerArea.x, innerArea.y - 1, innerArea.width - 1, 
+                    innerArea.height);
+          }
+        Insets insets = comboBox.getInsets();
+        int iconX = bounds.width - insets.right - comboIcon.getIconWidth() - 7;
+        int iconY = insets.top 
+            + (bounds.height - comboIcon.getIconHeight()) / 2; 
+        comboIcon.paintIcon(comboBox, g, iconX, iconY);
+        if (comboBox.isEnabled())
+          g.setColor(MetalLookAndFeel.getBlack());
+        else
+          g.setColor(MetalLookAndFeel.getControlDisabled());
+        FontMetrics fm = g.getFontMetrics(comboBox.getFont());
+        // FIXME: the label may need truncating with '...' and the 
+        // alignment needs work
+        g.drawString(text, insets.left + 5, fm.getAscent() + 4);
+      }
+  }
+}
Index: javax/swing/plaf/metal/MetalComboBoxEditor.java
===================================================================
RCS file: javax/swing/plaf/metal/MetalComboBoxEditor.java
diff -N javax/swing/plaf/metal/MetalComboBoxEditor.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ javax/swing/plaf/metal/MetalComboBoxEditor.java     13 Sep 2005 21:33:01 
-0000
@@ -0,0 +1,141 @@
+/* MetalComboBoxEditor.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., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 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.metal;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Insets;
+
+import javax.swing.JTextField;
+import javax.swing.plaf.basic.BasicComboBoxEditor;
+import javax.swing.plaf.metal.MetalLookAndFeel;
+import javax.swing.plaf.metal.MetalBorders.Flush3DBorder;
+
+/**
+ * An editor used by the address@hidden MetalComboBoxUI} class.
+ */
+public class MetalComboBoxEditor 
+  extends BasicComboBoxEditor
+{
+  /**
+   * A border used for the address@hidden JTextField} component.
+   */
+  static class MetalComboBoxEditorBorder extends Flush3DBorder
+  {
+    /**
+     * Creates a new border instance.
+     */
+    public MetalComboBoxEditorBorder()
+    {
+    }
+    
+    /**
+     * Paints the border for the specified component.
+     * 
+     * @param c  the component (ignored).
+     * @param g  the graphics device.
+     * @param x  the x-coordinate.
+     * @param y  the y-coordinate.
+     * @param w  the width.
+     * @param h  the height.
+     */
+    public void paintBorder(Component c, Graphics g, int x, int y, int w, 
+        int h)
+    {   
+      if (c.isEnabled())
+        // TODO: draw the enabled border here
+        super.paintBorder(c, g, x, y, w, h);
+      else
+        {
+          Color savedColor = g.getColor();
+          g.setColor(MetalLookAndFeel.getControlShadow());
+          g.drawRect(x, y, w - 1, h - 1);
+          g.setColor(savedColor);
+        }
+    }
+
+    /**
+     * Measures the width of this border.
+     *
+     * @param c the component whose border is to be measured.
+     *
+     * @return an Insets object whose <code>left</code>, <code>right</code>,
+     *         <code>top</code> and <code>bottom</code> fields indicate the
+     *         width of the border at the respective edge, which is zero
+     *         for the default implementation provided by AbstractButton.
+     *
+     * @see #getBorderInsets(java.awt.Component, java.awt.Insets)
+     */
+    public Insets getBorderInsets(Component c)
+    {
+      return editorBorderInsets;
+    }    
+  }
+    
+  /**
+   * A subclass of address@hidden MetalComboBoxEditor} that implements the 
+   * address@hidden javax.swing.plaf.UIResource} interface.
+   */
+  public static class UIResource
+    extends MetalComboBoxEditor
+    implements javax.swing.plaf.UIResource
+  {
+    /**
+     * Creates a new instance.
+     */
+    public UIResource()
+    {
+    }
+  }
+  
+  /** The editor's border insets. */
+  protected static Insets editorBorderInsets = new Insets(2, 2, 2, 2);
+  
+  /**
+   * Creates a new editor.
+   */
+  public MetalComboBoxEditor()
+  {
+    super();
+    editor = new JTextField();
+    editor.setBorder(new MetalComboBoxEditorBorder());
+  }
+  
+}

reply via email to

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