Wolf,

This is a simple extension to SwixML to support CardLayout.
I attached the modified LayoutConverter.java and ConstraintsConverter.java
from the 4th beta release. (All changes [3] are labeled with: //SL )
This is a minimal support for CardLayout which might be enough 
considering the low demand for this feature.

You access the card layout manager of a component installed by SwixML
in the good old way :) :

 (CardLayout)((Container)swingEngine.find("id_of_my_CLed_comp")).getLayout()

Best wishes,

Levente
/**********************************************************************

 * Copyright (C) 2003 swixml.org. <http://www.swixml.org>

 * 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 disclaimer that follows

 *    these conditions in the documentation and/or other materials

 *    provided with the distribution.

 *

 * 3. The name "Swixml" must not be used to endorse or promote products

 *    derived from this software without prior written permission.  For

 *    written permission, please contact Wolf Paulus <[EMAIL PROTECTED]>

 *

 * 4. Products derived from this software may not be called "Swixml", nor

 *    may "Swixml" appear in their name, without prior written permission

 *    from the Swixml Project Management.

 *

 * In addition, we request (but do not require) that you include in the

 * end-user documentation provided with the redistribution and/or in the

 * software itself an acknowledgement equivalent to the following:

 *     "This product includes software developed by the

 *      Swixml Project (http://www.swixml.org/)."

 * Alternatively, the acknowledgment may be graphical using the logos

 * available at http://www.swixml.org/

 *

 * 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 SWIX AUTHORS OR THE PROJECT

 * 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 Swixml Project and was originally

 * created by Wolf Paulus <[EMAIL PROTECTED]>. For more information on the

 * Swixml Project, please see <http://www.swixml.org/>.

 */



package org.swixml.converters;



import org.jdom.Attribute;



import java.awt.*;

import java.lang.reflect.Field;



/**

 * The <code>ConstraintsConverter</code> class defines a converter that returns 
Layout constants

 * based on layout type and input string.

 * <br>

 * <h3>Examples for Valid XML attribute notations:</h3>

 * <pre>

 * <ul>

 * <li>constraints="BorderLayout.NORTH"</li>

 * </ul>

 * </pre>

 *

 * @author <a href="mailto:[EMAIL PROTECTED]">Wolf Paulus</a>

 * @version $Revision: 1.1 $*

 * @see java.awt.LayoutManager



 */



public class ConstraintsConverter {

  /** converter's return type */

  public static final Class TEMPLATE = Object.class;



  /**

   * Converts Strings into Layout constants.

   * @param type <code>Class</code> Layout type

   * @param attr <code>Attribute</code> value needs to provide String which is 
used for the conversion

   * @return <code>Object</code> Layout constant

   */

  public static Object convert( final Class type, final Attribute attr ) {

    Object constrain = null;

    if (attr != null) {

      if (BorderLayout.class.equals( type )) {

        String value = attr.getValue();

        Field[] fields = BorderLayout.class.getFields();

        for (int i = 0; i < fields.length; i++) {

          if (value.endsWith( fields[i].getName() )) {

            try {

              constrain = fields[i].get( BorderLayout.class );

            } catch (Exception e) {

            }

            break;

          }

        }

      } else if (CardLayout.class.equals(type)){//SL

        //CardLayout accepts only constraints of type String

        constrain = attr.getValue();

      }

    }

    return constrain;

  }





  /**

   * A <code>Converters</code> conversTo method informs about the Class type 
the converter

   * is returning when its <code>convert</code> method is called

   * @return <code>Class</code> - the Class the converter is returning when its 
convert method is called

   */

  public Class convertsTo() {

    return TEMPLATE;

  }

}

/**********************************************************************

 * Copyright (C) 2003 swixml.org. <http://www.swixml.org>

 * 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 disclaimer that follows

 *    these conditions in the documentation and/or other materials

 *    provided with the distribution.

 *

 * 3. The name "Swixml" must not be used to endorse or promote products

 *    derived from this software without prior written permission.  For

 *    written permission, please contact Wolf Paulus <[EMAIL PROTECTED]>

 *

 * 4. Products derived from this software may not be called "Swixml", nor

 *    may "Swixml" appear in their name, without prior written permission

 *    from the Swixml Project Management.

 *

 * In addition, we request (but do not require) that you include in the

 * end-user documentation provided with the redistribution and/or in the

 * software itself an acknowledgement equivalent to the following:

 *     "This product includes software developed by the

 *      Swixml Project (http://www.swixml.org/)."

 * Alternatively, the acknowledgment may be graphical using the logos

 * available at http://www.swixml.org/

 *

 * 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 SWIX AUTHORS OR THE PROJECT

 * 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 Swixml Project and was originally

 * created by Wolf Paulus <[EMAIL PROTECTED]>. For more information on the

 * Swixml Project, please see <http://www.swixml.org/>.

 */



package org.swixml.converters;



import org.jdom.Attribute;

import org.swixml.Converter;

import org.swixml.Localizer;



import java.awt.*;

import java.util.StringTokenizer;

import java.lang.reflect.Field;



/**

 * The <code>LayoutConverter</code> class defines a converter that creates 
LayoutManager objects

 * based on a provided String.

 * <h3>Examples for Valid XML attribute notations:</h3>

 * <pre>

 * <p><b>FlowLayout</b><br>can be created with all 3 construtors:<br>

 * <ul>

 * <li>FlowLayout()</li>

 * <li>FlowLayout(int align)</li>

 * <li>FlowLayout(int align, int hgap, int vgap)</li>

 * </ul>

 *

 * <ul>

 * <li>BorderLayout()</li>

 * <li>BorderLayout(int hgap, int vgap)</li>

 * </ul>

 *

 * <ul>

 * <li>GridBagLayout()</li>

 * <li>GridBagLayout(rowWeights(0,0,1.0,0))</li>

 * <li>GridBagLayout(colWeights(0.5, 0.5, 1.0, 99.9))</li>

 * <li>GridBagLayout(columnWidths(5, 5, 10, 33))</li>

 * <li>GridBagLayout(rowHeights(5, 5, 10, 33))</li>

 * </ul>

 *

 * </pre>

 *

 * @author <a href="mailto:[EMAIL PROTECTED]">Wolf Paulus</a>

 * @version $Revision: 1.1 $

 *

 * @see java.awt.LayoutManager

 * @see org.swixml.ConverterLibrary



 */

public class LayoutConverter implements Converter {

  /** converter's return type */

  public static final Class TEMPLATE = LayoutManager.class;



  public static final String FLOW_LAYOUT = "flowlayout";

  public static final String BORDER_LAYOUT = "borderlayout";

  public static final String GRID_LAYOUT = "gridlayout";

  public static final String GRIDBAG_LAYOUT = "gridbaglayout";

  //SL

  public static final String CARD_LAYOUT = "cardlayout";



  /**

   * Convert the specified input object into an output object of the

   * specified type.

   * <pre>

   * <p><b>FlowLayout</b><br>can be created with all 3 construtors:<br>

   * <ul>

   * <li>FlowLayout()</li>

   * <li>FlowLayout(int align)</li>

   * <li>FlowLayout(int align, int hgap, int vgap)</li>

   * </ul>

   *

   * <ul>

   * <li>BorderLayout()</li>

   * <li>BorderLayout(int hgap, int vgap)</li>

   * </ul>

   *

   * <ul>

   * <li>BoxLayout: see Box tag</li>

   * </ul>

   *

   * <ul>

   * <li>GridLayout()</li>

   * <li>GridLayout(int rows, int cols)</li>

   * <li>GridLayout(int rows, int cols, int hgap, int vgap) </li>

   * </ul>

   *

   * <ul>

   * <li>GridBagLayout()</li>

   * <li>GridBagLayout(rowWeights(0,0,1.0,0))</li>

   * <li>GridBagLayout(colWeights(0.5, 0.5, 1.0, 99.9))</li>

   * <li>GridBagLayout(columnWidths(5, 5, 10, 33))</li>

   * <li>GridBagLayout(rowHeights(5, 5, 10, 33))</li>

   * </ul>

   *

   * </pre>

   * @param type <code>Class</code> not used

   * @param attr <code>Attribute</code> value is needed for conversion

   * @return <code>Object</code>

   */

  public Object convert( final Class type, final Attribute attr, final 
Localizer localizer ) {

    LayoutManager lm = null;

    StringTokenizer st = new StringTokenizer( attr.getValue(), "(,)" );

    String s = st.nextToken().trim();  // here, s should contain the 
LayoutManager's name

    if (s != null) {

      s = s.toLowerCase();

      if (s.equals( LayoutConverter.FLOW_LAYOUT )) {

        try {

          if (st.hasMoreTokens()) {

            //

            //  First FlowLayout parameter might be a pre-defined constant's 
name

            //

            Object o = PrimitiveConverter.conv( null, new Attribute( "NA", 
st.nextToken() ), localizer );

            int[] para = Util.ia( st );

            //

            //  Remaining paramters should be integer values

            //

            if (para.length < 2)

              lm = new FlowLayout( Integer.valueOf( o.toString() ).intValue() );

            else

              lm = new FlowLayout( Integer.valueOf( o.toString() ).intValue(), 
para[0], para[1] );

          }

        } catch (Exception e) {

        }

        if (lm == null) {

          lm = new FlowLayout();

        }

      } else if (s.equals( LayoutConverter.BORDER_LAYOUT )) {

        int[] para = Util.ia( st );

        if (para.length < 2)

          lm = new BorderLayout();

        else

          lm = new BorderLayout( para[0], para[1] );

      } else if (s.equals( LayoutConverter.GRID_LAYOUT )) {

        int[] para = Util.ia( st );

        int l = para.length;

        if (4 <= para.length)

          lm = new GridLayout( para[0], para[1], para[2], para[3] );

        else if (2 <= para.length)

          lm = new GridLayout( para[0], para[1] );

        else

          lm = new GridLayout();

      } else if (s.equals( LayoutConverter.GRIDBAG_LAYOUT )) {

        //

        //  Gridbag Layouts have some public arrays, accept one but only one.

        //    public double[]  rowWeights

        //    public double[]  colWeights

        //

        lm = new GridBagLayout();



        if (st.hasMoreTokens()) {

          try {

            String fieldname = st.nextToken();

            Field field = GridBagLayout.class.getField( fieldname );

            if (field != null) {

              Class fieldtype = field.getType();



              if (int[].class.equals( fieldtype )) {

                field.set( lm, Util.ia( st ) );

              } else if (double[].class.equals( fieldtype )) {

                field.set( lm, Util.da( st ) );

              }



            }

          } catch (NoSuchFieldException e) {

            System.err.println( e.getMessage() );

          } catch (SecurityException e) {

            System.err.println( e.getMessage() );

          } catch (IllegalArgumentException e) {

            System.err.println( e.getMessage() );

          } catch (IllegalAccessException e) {

            System.err.println( e.getMessage() );

          }

        }

      } else if( s.equals( LayoutConverter.CARD_LAYOUT)) {//SL

        int[] para = Util.ia( st );

        if (para.length < 2)

          lm = new CardLayout();

        else

          lm = new CardLayout( para[0], para[1] );

      }

    }

    return lm;

  }





  /**

   * A <code>Converters</code> conversTo method informs about the Class type 
the converter

   * is returning when its <code>convert</code> method is called

   * @return <code>Class</code> - the Class the converter is returning when its 
convert method is called

   */

  public Class convertsTo() {

    return TEMPLATE;

  }

}

Reply via email to