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;
}
}