jstrachan 2003/02/20 10:14:53 Modified: jelly/jelly-tags/swt/src/java/org/apache/commons/jelly/tags/swt WidgetTag.java Added: jelly/jelly-tags/swt/src/java/org/apache/commons/jelly/tags/swt/converters ColorConverter.java Log: added patch supplied by Christiaan ten Klooster to support the setting of colours of widgets http://jira.werken.com/secure/ViewIssue.jspa?key=JELLY-32 Revision Changes Path 1.1 jakarta-commons/jelly/jelly-tags/swt/src/java/org/apache/commons/jelly/tags/swt/converters/ColorConverter.java Index: ColorConverter.java =================================================================== /* * $Header: /home/cvs/jakarta-commons/jelly/jelly-tags/swt/src/java/org/apache/commons/jelly/tags/swt/converters/ColorConverter.java,v 1.1 2003/02/20 18:14:53 jstrachan Exp $ * $Revision: 1.1 $ * $Date: 2003/02/20 18:14:53 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * $Id: ColorConverter.java,v 1.1 2003/02/20 18:14:53 jstrachan Exp $ */ package org.apache.commons.jelly.tags.swt.converters; import java.util.StringTokenizer; import org.apache.commons.beanutils.Converter; import org.eclipse.swt.graphics.RGB; /** * A Converter that converts Strings in the form "#uuuuuu" or "x,y,z" into a RGB object * * @author <a href="mailto:[EMAIL PROTECTED]">Christiaan ten Klooster</a> * @version $Revision: 1.1 $ */ public class ColorConverter implements Converter { private static final ColorConverter instance = new ColorConverter(); private static String usageText = "Color value should be in the form of '#xxxxxx' or 'x,y,z'"; public static ColorConverter getInstance() { return instance; } /** * Parsers a String in the form "x, y, z" into an SWT RGB class * @param value * @return RGB */ protected RGB parseRGB(String value) { StringTokenizer enum = new StringTokenizer(value, ","); int red = 0; int green = 0; int blue = 0; if (enum.hasMoreTokens()) { red = parseNumber(enum.nextToken()); } if (enum.hasMoreTokens()) { green = parseNumber(enum.nextToken()); } if (enum.hasMoreTokens()) { blue = parseNumber(enum.nextToken()); } return new RGB(red, green, blue); } /** * Parsers a String in the form "#xxxxxx" into an SWT RGB class * @param value * @return RGB */ protected RGB parseHtml(String value) { if (value.length() != 7) { throw new IllegalArgumentException(usageText); } int colorValue = 0; try { colorValue = Integer.parseInt(value.substring(1), 16); java.awt.Color swingColor = new java.awt.Color(colorValue); return new RGB( swingColor.getRed(), swingColor.getGreen(), swingColor.getBlue()); } catch (NumberFormatException ex) { throw new IllegalArgumentException( value + "is not a valid Html color\n " + ex); } } /** * Parse a String */ public RGB parse(String value) { if (value.length() <= 1) { throw new IllegalArgumentException(usageText); } if (value.charAt(0) == '#') { return parseHtml(value); } else if (value.indexOf(',') != -1) { return parseRGB(value); } else { throw new IllegalArgumentException(usageText); } } // Converter interface //------------------------------------------------------------------------- public Object convert(Class type, Object value) { Object answer = null; if (value != null) { String text = value.toString(); answer = parse(text); } System.out.println("Converting value: " + value + " into: " + answer); return answer; } protected int parseNumber(String text) { text = text.trim(); return Integer.parseInt(text.trim()); } } 1.9 +234 -187 jakarta-commons/jelly/jelly-tags/swt/src/java/org/apache/commons/jelly/tags/swt/WidgetTag.java Index: WidgetTag.java =================================================================== RCS file: /home/cvs/jakarta-commons/jelly/jelly-tags/swt/src/java/org/apache/commons/jelly/tags/swt/WidgetTag.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- WidgetTag.java 19 Feb 2003 07:24:40 -0000 1.8 +++ WidgetTag.java 20 Feb 2003 18:14:53 -0000 1.9 @@ -68,12 +68,15 @@ import org.apache.commons.jelly.JellyTagException; import org.apache.commons.jelly.XMLOutput; import org.apache.commons.jelly.tags.core.UseBeanTag; +import org.apache.commons.jelly.tags.swt.converters.ColorConverter; import org.apache.commons.jelly.tags.swt.converters.PointConverter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Widget; @@ -87,196 +90,240 @@ */ public class WidgetTag extends UseBeanTag { - /** The Log to which logging calls will be made. */ - private static final Log log = LogFactory.getLog(WidgetTag.class); + /** The Log to which logging calls will be made. */ + private static final Log log = LogFactory.getLog(WidgetTag.class); - private Widget parent; - private int style = SWT.NULL; - - public WidgetTag(Class widgetClass) { - super(widgetClass); - } - - public WidgetTag(Class widgetClass, int style) { - super(widgetClass); - this.style = style; - } - - public String toString() { - return "WidgetTag[widget=" + getWidget() + "]"; - } - - - // Properties - //------------------------------------------------------------------------- - - /** - * @return the visible widget, if there is one. - */ - public Widget getWidget() { - Object bean = getBean(); - if ( bean instanceof Widget ) { - return (Widget) bean; - } - return null; - } - - /** - * @return the parent widget which this widget will be added to. - */ - public Widget getParentWidget() { - if (parent == null) { - WidgetTag tag = (WidgetTag) findAncestorWithClass(WidgetTag.class); - if (tag != null) { - parent = tag.getWidget(); - } - } - return parent; - } - - // Tag interface - //------------------------------------------------------------------------- - public void doTag(XMLOutput output) throws JellyTagException { - Map attributes = getAttributes(); - Object parent = attributes.remove("parent"); - if (parent != null) { - if (parent instanceof Widget) { - this.parent = (Widget) parent; - } - else { - throw new JellyTagException( - "The parent attribute is not a Widget, it is of type: " - + parent.getClass().getName() + " value: " + parent - ); - } - } - super.doTag(output); - } - - // Implementation methods - //------------------------------------------------------------------------- - - /** - * Factory method to create a new widget - */ - protected Object newInstance(Class theClass, Map attributes, XMLOutput output) throws JellyTagException { - int style = getStyle(attributes); - - // now lets call the constructor with the parent - Widget parent = getParentWidget(); - Widget widget = (Widget) createWidget(theClass, parent, style); - if (parent != null) { - attachWidgets(parent, widget); - } - - return widget; - } - - /* - * @see org.apache.commons.jelly.tags.core.UseBeanTag#setBeanProperties(java.lang.Object, java.util.Map) - */ - protected void setBeanProperties(Object bean, Map attributes) - throws JellyTagException { + private Widget parent; + private int style = SWT.NULL; + + public WidgetTag(Class widgetClass) { + super(widgetClass); + } + + public WidgetTag(Class widgetClass, int style) { + super(widgetClass); + this.style = style; + } + + public String toString() { + return "WidgetTag[widget=" + getWidget() + "]"; + } + + // Properties + //------------------------------------------------------------------------- + + /** + * @return the visible widget, if there is one. + */ + public Widget getWidget() { + Object bean = getBean(); + if (bean instanceof Widget) { + return (Widget) bean; + } + return null; + } + + /** + * @return the parent widget which this widget will be added to. + */ + public Widget getParentWidget() { + if (parent == null) { + WidgetTag tag = (WidgetTag) findAncestorWithClass(WidgetTag.class); + if (tag != null) { + parent = tag.getWidget(); + } + } + return parent; + } + + // Tag interface + //------------------------------------------------------------------------- + public void doTag(XMLOutput output) throws JellyTagException { + Map attributes = getAttributes(); + Object parent = attributes.remove("parent"); + if (parent != null) { + if (parent instanceof Widget) { + this.parent = (Widget) parent; + } else { + throw new JellyTagException( + "The parent attribute is not a Widget, it is of type: " + + parent.getClass().getName() + + " value: " + + parent); + } + } + super.doTag(output); + } + + // Implementation methods + //------------------------------------------------------------------------- + + /** + * Factory method to create a new widget + */ + protected Object newInstance( + Class theClass, + Map attributes, + XMLOutput output) + throws JellyTagException { + int style = getStyle(attributes); + + // now lets call the constructor with the parent + Widget parent = getParentWidget(); + Widget widget = (Widget) createWidget(theClass, parent, style); + if (parent != null) { + attachWidgets(parent, widget); + } + + return widget; + } + + /* + * @see org.apache.commons.jelly.tags.core.UseBeanTag#setBeanProperties(java.lang.Object, java.util.Map) + */ + protected void setBeanProperties(Object bean, Map attributes) + throws JellyTagException { - // special handling of size property as the Control object breaks the - // JavaBean naming conventions by overloading the setSize() method if (bean instanceof Control) { - Object size = attributes.remove("size"); - if (size != null) { - Point point = null; - if (size instanceof Point) { - point = (Point) size; - } - else { - point = PointConverter.getInstance().parse(size.toString()); - } - Control control = (Control) bean; - control.setSize(point); - } + Control control = (Control) bean; + + // Special handling of size property as the Control object breaks the + // JavaBean naming conventions by overloading the setSize() method + Object size = attributes.remove("size"); + setSize(control, size); + + // Special handling of color property as the Control object breaks the + // JavaBean naming conventions by overloading the setBackground() or setForeground() method + Object colorValue = attributes.remove("background"); + Color background = getColor(control, colorValue); + control.setBackground(background); + + colorValue = attributes.remove("foreground"); + Color foreground = getColor(control, colorValue); + control.setForeground(foreground); + + } + + super.setBeanProperties(bean, attributes); + } + + /** + * Get a color for the control + * @param control + * @param colorValue + */ + protected Color getColor(Control control, Object colorValue) { + Color color = null; + if (colorValue != null) { + RGB rgb = null; + if (color instanceof Color) { + color = (Color) colorValue; + } else { + rgb = ColorConverter.getInstance().parse(colorValue.toString()); + color = new Color(control.getDisplay(), rgb); + } + } + return color; + } + + /** + * set the size of the control + * @param control + * @param size + */ + protected void setSize(Control control, Object size) { + Point point = null; + if (size != null) { + if (size instanceof Point) { + point = (Point) size; + } else { + point = PointConverter.getInstance().parse(size.toString()); + } + control.setSize(point); } - // TODO Auto-generated method stub - super.setBeanProperties(bean, attributes); - } - - - - /** - * Provides a strategy method to allow a new child widget to be attached to - * its parent - * - * @param parent is the parent widget which is never null - * @param widget is the new child widget to be attached to the parent - */ - protected void attachWidgets(Widget parent, Widget widget) { - // set the content that will be scrolled if the parent is a ScrolledComposite - if (parent instanceof ScrolledComposite - && widget instanceof Control) { - ScrolledComposite scrolledComposite = (ScrolledComposite) parent; - scrolledComposite.setContent((Control) widget); - } - } - - /** - * Factory method to create an instance of the given Widget class with - * the given parent and SWT style - * - * @param theClass is the type of widget to create - * @param parent is the parent widget - * @param style the SWT style code - * @return the new Widget - */ - protected Object createWidget(Class theClass, Widget parent, int style) throws JellyTagException { - if (theClass == null) { - throw new JellyTagException( "No Class available to create the new widget"); - } - - try { - if (parent == null) { - // lets try call a constructor with a single style - Class[] types = { int.class }; - Constructor constructor = theClass.getConstructor(types); - if (constructor != null) { - Object[] arguments = { new Integer(style)}; - return constructor.newInstance(arguments); - } - } else { - // lets try to find the constructor with 2 arguments with the 2nd argument being an int - Constructor[] constructors = theClass.getConstructors(); - if (constructors != null) { - for (int i = 0, size = constructors.length; i < size; i++ ) { - Constructor constructor = constructors[i]; - Class[] types = constructor.getParameterTypes(); - if (types.length == 2 && types[1].isAssignableFrom(int.class)) { - if (types[0].isAssignableFrom(parent.getClass())) { - Object[] arguments = { parent, new Integer(style)}; - return constructor.newInstance(arguments); - } - } - } - } - } - return theClass.newInstance(); - } catch (NoSuchMethodException e) { - throw new JellyTagException(e); - } catch (InstantiationException e) { - throw new JellyTagException(e); - } catch (IllegalAccessException e) { - throw new JellyTagException(e); - } catch (InvocationTargetException e) { - throw new JellyTagException(e); - } - } - - /** - * Creates the SWT style code for the current attributes - * @return the SWT style code - */ - protected int getStyle(Map attributes) throws JellyTagException { - String text = (String) attributes.remove("style"); - if (text != null) { - return SwtHelper.parseStyle(SWT.class, text); - } - return style; - } + } + + /** + * Provides a strategy method to allow a new child widget to be attached to + * its parent + * + * @param parent is the parent widget which is never null + * @param widget is the new child widget to be attached to the parent + */ + protected void attachWidgets(Widget parent, Widget widget) { + // set the content that will be scrolled if the parent is a ScrolledComposite + if (parent instanceof ScrolledComposite && widget instanceof Control) { + ScrolledComposite scrolledComposite = (ScrolledComposite) parent; + scrolledComposite.setContent((Control) widget); + } + } + + /** + * Factory method to create an instance of the given Widget class with + * the given parent and SWT style + * + * @param theClass is the type of widget to create + * @param parent is the parent widget + * @param style the SWT style code + * @return the new Widget + */ + protected Object createWidget(Class theClass, Widget parent, int style) + throws JellyTagException { + if (theClass == null) { + throw new JellyTagException("No Class available to create the new widget"); + } + + try { + if (parent == null) { + // lets try call a constructor with a single style + Class[] types = { int.class }; + Constructor constructor = theClass.getConstructor(types); + if (constructor != null) { + Object[] arguments = { new Integer(style)}; + return constructor.newInstance(arguments); + } + } else { + // lets try to find the constructor with 2 arguments with the 2nd argument being an int + Constructor[] constructors = theClass.getConstructors(); + if (constructors != null) { + for (int i = 0, size = constructors.length; + i < size; + i++) { + Constructor constructor = constructors[i]; + Class[] types = constructor.getParameterTypes(); + if (types.length == 2 + && types[1].isAssignableFrom(int.class)) { + if (types[0].isAssignableFrom(parent.getClass())) { + Object[] arguments = + { parent, new Integer(style)}; + return constructor.newInstance(arguments); + } + } + } + } + } + return theClass.newInstance(); + } catch (NoSuchMethodException e) { + throw new JellyTagException(e); + } catch (InstantiationException e) { + throw new JellyTagException(e); + } catch (IllegalAccessException e) { + throw new JellyTagException(e); + } catch (InvocationTargetException e) { + throw new JellyTagException(e); + } + } + + /** + * Creates the SWT style code for the current attributes + * @return the SWT style code + */ + protected int getStyle(Map attributes) throws JellyTagException { + String text = (String) attributes.remove("style"); + if (text != null) { + return SwtHelper.parseStyle(SWT.class, text); + } + return style; + } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]