|
XulFormHelper |
|
/* ** Luxor - XML User Interface Language (XUL) Toolkit ** Copyright (c) 2001, 2002 by Gerald Bauer ** ** This program is free software. ** ** You may redistribute it and/or modify it under the terms of the GNU ** General Public License as published by the Free Software Foundation. ** Version 2 of the license should be included with this distribution in ** the file LICENSE, as well as License.html. If the license is not ** included with this distribution, you may find a copy at the FSF web ** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the ** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. ** ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR ** REDISTRIBUTION OF THIS SOFTWARE. ** */ package luxor.core; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import org.jdom.*; import org.jdom.input.*; import luxor.spi.*; import luxor.status.*; import luxor.swing.*; import luxor.*; public class XulFormHelper implements JComponentResolver { static Logger T = Logger.getLogger( XulFormHelper.class ); private NContainer _container; private String _formKey; private LinkedHashMap _inputIndex = new LinkedHashMap( 13 ); private HashMap _jcomponentIndex = new HashMap( 13 ); public XulFormHelper( String formKey ) { _formKey = formKey; } public void setup() { T.debug( "enter setup()" ); XulManager xul = XulManager.getXulManager(); _container = xul.createNContainerFromBox( _formKey, this ); if( _container == null ) { Xul.error( "form '" + _formKey + "' not found; cannot setup form" ); return; } // link and resolve input controls linkControls(); } public Iterator getInputControls() { return _inputIndex.values().iterator(); } public JComponent getJComponent() { if( _container == null ) return null; else return _container.getJComponent(); } public List getValidationErrors() { ArrayList errors = new ArrayList(); for( Iterator it = _inputIndex.entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = ( Map.Entry ) it.next(); String key = ( String ) entry.getKey(); XulInput input = ( XulInput ) entry.getValue(); errors.addAll( input.getValidator().getErrors() ); } return errors; } public boolean isValid() { // loop over input controls (xinput) boolean isValid = true; for( Iterator it = _inputIndex.entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = ( Map.Entry ) it.next(); String key = ( String ) entry.getKey(); XulInput input = ( XulInput ) entry.getValue(); if( !input.isValid() ) return false; } return isValid; } public void addComponent( String key, JComponent comp ) { _jcomponentIndex.put( key, comp ); } public void addInput( XulInput input ) { _inputIndex.put( input.getId(), input ); } /** * export form's data as xml note: this method is currently experimental and * will be changed and improved substantly over time */ public String exportAsXml() { StringBuffer buf = new StringBuffer(); buf.append( "<" + _formKey + ">\n" ); for( Iterator it = _inputIndex.entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = ( Map.Entry ) it.next(); String key = ( String ) entry.getKey(); XulInput input = ( XulInput ) entry.getValue(); buf.append( "<" + key + ">" + input.getText() + "</" + key + ">\n" ); } buf.append( "</" + _formKey + ">\n" ); return buf.toString(); } /** * import form's data from xml note: this method is currently experimental * and will be changed and improved substantly over time */ public void importFromXml( String xml ) { try { Status.info( "auto-fill form " + _formKey + " using xml data" ); SAXBuilder builder = new SAXBuilder(); Document doc = builder.build( new StringReader( xml ) ); // for now assume that root element holds all field data Element root = doc.getRootElement(); // loop over root's element children and see if the match with an input control Iterator it = root.getChildren().iterator(); while( it.hasNext() ) { // todo: use instanceof to check if child is an element Element inputData = ( Element ) it.next(); String name = inputData.getName(); XulInput input = ( XulInput ) _inputIndex.get( name ); if( input == null ) { Status.info( " field " + name + " not found; data ignored" ); } else { String value = inputData.getTextTrim(); Status.info( " setting field " + name + " to " + value ); input.setText( value ); } } } catch( JDOMException jex ) { Xul.error( "failed to parse form data: " + jex.toString() ); } } public void linkControls() { T.debug( "enter linkControls()" ); // link input controls (XulInput) with components for( Iterator it = _inputIndex.entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = ( Map.Entry ) it.next(); String key = ( String ) entry.getKey(); XulInput input = ( XulInput ) entry.getValue(); T.debug( "link control " + key ); NInput comp = _container.lookupNInput( key ); if( comp == null ) { Xul.error( "failed to resolve input reference " + key + "; input reference not found" ); continue; } input.setComponent( comp ); } T.debug( "leave linkControls()" ); } public JComponent lookupJComponent( String key ) { return ( JComponent ) _jcomponentIndex.get( key ); } }
|
XulFormHelper |
|