|
XulLoader |
|
/*
** 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.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import luxor.core.box.*;
import luxor.core.data.*;
import luxor.core.grid.*;
import luxor.core.input.*;
import luxor.core.menu.*;
import luxor.core.misc.*;
import luxor.core.portal.*;
import luxor.core.tab.*;
import luxor.core.table.*;
import luxor.core.toolbar.*;
import luxor.core.widget.*;
import luxor.core.xslt.*;
import luxor.status.*;
import luxor.*;
public class XulLoader
{
static Logger T = Logger.getLogger( XulLoader.class );
private XulManager _manager;
public XulLoader( XulManager manager )
{
_manager = manager;
}
public void load( String name )
{
try
{
T.debug( "loading xul file " + name );
InputStream in = _manager.getResourceAsStream( name );
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build( in );
Element xul = doc.getRootElement();
createElements( null, xul );
T.debug( "xul file " + name + " successfully loaded" );
}
catch( JDOMException jex )
{
Xul.error( "failed to load xul file '" + name + "': " + jex.toString() );
}
}
protected void createElements( XulContainer parent, Element element )
{
String type = element.getName();
if( type.equals( Xul.Element.XUL ) )
{
parent = new XulDef( element, _manager );
}
else if( type.equals( Xul.Element.STYLESHEET ) )
{
StylesheetDef def = new StylesheetDef( element );
Element result = def.getContent();
List children = result.getChildren();
if( children.size() == 0 )
// no content; don't bother
return;
// swap content; use stylesheet transformed content
// don't touch parent; so stylesheet/result stays "invisible"/is ignored
// todo:
// 1) do i need to unmount stylesheet
// and replace it with the transformed content/result?
// 2) who is using parent?
// --
// is this a quick and dirty hack?
// should i put the transformation of templates/stylesheets in it's own pass
// and keep it separate from the ui construction?
element = result;
}
else if( type.equals( Xul.Element.DATAGRID ) )
{
DataGridDef def = new DataGridDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.COLGROUP ) )
{
ColGroupDef def = new ColGroupDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TREE ) )
{
TreeDef def = new TreeDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.GRID ) )
{
GridDef def = new GridDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.COLUMNS ) )
{
ColumnsDef def = new ColumnsDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.COLUMN ) )
{
ColumnDef def = new ColumnDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.ROWS ) )
{
RowsDef def = new RowsDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.ROW ) )
{
RowDef def = new RowDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TABBOX ) )
{
TabBoxDef def = new TabBoxDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TABS ) )
{
TabsDef def = new TabsDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TABPANELS ) )
{
TabPanelsDef def = new TabPanelsDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TABPANEL ) )
{
TabPanelDef def = new TabPanelDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.BOX ) )
{
BoxDef def = new BoxDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.HBOX ) )
{
HBoxDef def = new HBoxDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.VBOX ) )
{
VBoxDef def = new VBoxDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.GROUPBOX ) )
{
GroupBoxDef def = new GroupBoxDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.ANIM ) )
{
AnimDef def = new AnimDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TOOLBAR ) )
{
ToolBarDef def = new ToolBarDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.KEYSET ) )
{
KeySetDef def = new KeySetDef( element, _manager );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.MENUBAR ) )
{
MenuBarDef def = new MenuBarDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.MENU ) )
{
MenuDef def = new MenuDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.MENUPOPUP ) )
{
MenuPopupDef def = new MenuPopupDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.POPUP ) )
{
PopupDef def = new PopupDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.PORTAL ) )
{
PortalDef def = new PortalDef( element );
parent.add( def );
return;
// note: we want to keep all content
// attached verbatim to portal element
// no further processing of children desired
}
else if( type.equals( Xul.Element.PORTLET ) )
{
PortletRef ref = new PortletRef( element );
parent.add( ref );
parent = ref;
}
else if( type.equals( Xul.Element.LIST ) )
{
ListDef def = new ListDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.MAP ) )
{
MapDef def = new MapDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TABLE ) )
{
TableDef def = new TableDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TR ) )
{
TableRowDef def = new TableRowDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.TD ) )
{
TableDataDef def = new TableDataDef( element );
parent.add( def );
parent = def;
}
else if( type.equals( Xul.Element.MENUITEM ) )
{
MenuItemDef def = new MenuItemDef( element );
parent.add( def );
// menuitem shouldn't contain any elements
}
else if( type.equals( Xul.Element.MENUREF ) )
{
MenuRef ref = new MenuRef( element );
parent.add( ref );
}
else if( type.equals( Xul.Element.KEY ) )
{
KeyDef def = new KeyDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.BUTTON ) )
{
ButtonDef def = new ButtonDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.TOOLBARBUTTON ) )
{
ToolBarButtonDef def = new ToolBarButtonDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.TOOLBARSEPARATOR ) )
{
ToolBarSeparatorDef def = new ToolBarSeparatorDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.SEPARATOR ) )
{
SeparatorDef def = new SeparatorDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.MENUSEPARATOR ) )
{
MenuSeparatorDef def = new MenuSeparatorDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.ICON ) )
{
IconDef def = new IconDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.COMPONENTREF )
|| type.equals( Xul.Element.GADGET ) )
{
ComponentRef ref = new ComponentRef( element );
parent.add( ref );
}
else if( type.equals( Xul.Element.LABEL ) )
{
LabelDef def = new LabelDef( element );
parent.add( def );
return;
// note: we want to keep all content
// attached verbatim to portal element
// no further processing of children desired
}
else if( type.equals( Xul.Element.CHOICE ) )
{
ChoiceDef def = new ChoiceDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.MCHOICE ) )
{
MChoiceDef def = new MChoiceDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.CHECKBOX ) )
{
CheckBoxDef def = new CheckBoxDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.TEXTAREA ) )
{
TextAreaDef def = new TextAreaDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.TEXT ) )
{
TextDef def = new TextDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.PASSWORD ) )
{
PasswordDef def = new PasswordDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.DISPLAYURL ) )
{
DisplayUrlDef def = new DisplayUrlDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.ENTRY ) )
{
ListEntryDef def = new ListEntryDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.COMMAND ) )
{
CommandDef def = new CommandDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.SPACER ) )
{
SpacerDef def = new SpacerDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.TAB ) )
{
TabDef def = new TabDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.CAPTION ) )
{
CaptionDef def = new CaptionDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.IFRAME ) )
{
IFrameDef def = new IFrameDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.IMAGE ) )
{
ImageDef def = new ImageDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.COL ) )
{
ColDef def = new ColDef( element );
parent.add( def );
}
else if( type.equals( Xul.Element.PRE ) )
{
PreDef def = new PreDef( element );
parent.add( def );
}
else
{
Xul.syntax( "unsupported element '" + type + "'" );
}
// process children
List list = element.getChildren();
for( Iterator it = list.iterator(); it.hasNext(); )
{
Element child = ( Element ) it.next();
createElements( parent, child );
}
}
}
|
XulLoader |
|