|
XulNode |
|
/* ** 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.util.*; import javax.swing.*; import org.jaxen.JaxenException; import org.jaxen.XPathSyntaxException; import org.jaxen.jdom.XPath; import org.jdom.*; import luxor.css.*; import luxor.css.xul.*; import luxor.css.xul.data.*; import luxor.spi.*; import luxor.status.*; import luxor.util.*; import luxor.*; public class XulNode { static Logger T = Logger.getLogger( XulNode.class ); private Element _element; private String _id; /** * cached style properties todo: use Style instead of StyleSheet? */ private StyleSheet _style; private String _styleClass; public XulNode( Element element ) { _element = element; // make sure required attribute id is always present _id = getAttribute( Xul.Attribute.ID, "anonymous" ); _styleClass = getAttribute( Xul.Attribute.CLASS, "anonymous" ); T.debug( "created " + element.getName() + ": id=" + _id ); } public KeyStroke getAccelKey() { String accelKey = getAttribute( Xul.Attribute.KEY ); if( accelKey == null ) return null; String accel = XulManager.getXulManager().lookupKey( accelKey ); if( accel == null ) return null; else return KeyStroke.getKeyStroke( accel ); } public char getAccessKey() { String accessKey = getAttribute( Xul.Attribute.ACCESSKEY ); if( accessKey == null || accessKey.length() == 0 ) return 0; return accessKey.charAt( 0 ); } public Action getAction() { String actionKey = getAttribute( Xul.Attribute.COMMAND ); if( actionKey == null ) return null; Action action = XulManager.getXulManager().lookupAction( actionKey ); if( action == null ) Xul.warning( "action " + actionKey + " not found" ); return action; } public int getAlignAttribute( String key, int defaultValue ) { String value = getAttribute( key ); if( value == null ) return defaultValue; else { value = value.toLowerCase().trim(); if( value.equals( "top" ) ) return Xul.Align.TOP; else if( value.equals( "center" ) ) return Xul.Align.CENTER; else if( value.equals( "bottom" ) ) return Xul.Align.BOTTOM; else if( value.equals( "left" ) ) return Xul.Align.LEFT; else if( value.equals( "right" ) ) return Xul.Align.RIGHT; else if( value.equals( "max" ) ) return Xul.Align.MAX; else if( value.equals( "middle" ) ) return Xul.Align.MIDDLE; else return defaultValue; } } public String getAttribute( String key, String defaultValue ) { String value = _element.getAttributeValue( key ); if( value == null ) return defaultValue; else return value; } public String getAttribute( String key ) { return _element.getAttributeValue( key ); } public boolean getBooleanAttribute( String key, boolean defaultValue ) { String value = getAttribute( key ); if( value == null ) return defaultValue; else { value = value.toLowerCase().trim(); if( value.equals( "true" ) || value.equals( "yes" ) || value.equals( "on" ) ) return true; else return false; } } public boolean getChecked() { return getBooleanAttribute( Xul.Attribute.CHECKED, false ); } public int getColSpan() { return getIntAttribute( Xul.Attribute.COLSPAN, 1 ); } public boolean getCollapsible() { return getBooleanAttribute( Xul.Attribute.COLLAPSIBLE, false ); } public int getCols( int defaultValue ) { return getIntAttribute( Xul.Attribute.COLS, defaultValue ); } public Element getElement() { return _element; } public String getElementName() { return _element.getName(); } public int getFlex() { return getIntAttribute( Xul.Attribute.FLEX, 0 ); } public String getHeading( String defaultValue ) { return getAttribute( Xul.Attribute.HEADING, defaultValue ); } public int getHeight() { StyleSheet style = getStyle(); CssValue value = style.lookup( Css.Property.HEIGHT ); if( value == null ) return -1; if( value.getType() == CssValue.INTEGER ) return ( ( CssInteger ) value ).getIntegerValue(); else if( value.getType() == CssValue.PIXEL ) return ( int ) ( ( CssFloat ) value ).getFloatValue(); else { Xul.syntax( "unsupported value type for css property height" ); return -1; } } public HistoryModel getHistory() { String historyKey = getAttribute( Xul.Attribute.HISTORY ); if( historyKey == null ) return null; HistoryModel history = XulManager.getXulManager().lookupHistory( historyKey ); if( history == null ) Xul.warning( "history " + historyKey + " not found" ); return history; } public ImageIcon getIcon() { String iconKey = getAttribute( Xul.Attribute.ICON ); if( iconKey == null ) return null; ImageIcon icon = XulManager.getXulManager().lookupIcon( iconKey ); if( icon == null ) Xul.warning( "icon " + iconKey + " not found" ); return icon; } public String getId() { return _id; } public int getIntAttribute( String key, int defaultValue ) { String value = getAttribute( key ); if( value == null ) return defaultValue; else { try { return Integer.parseInt( value ); } catch( NumberFormatException nex ) { Xul.warning( "invalid number format: " + nex.toString() ); return defaultValue; } } } public String getKey() { return getAttribute( Xul.Attribute.KEY ); } public String getLabel() { return getAttribute( Xul.Attribute.LABEL ); } public String[] getList() { String listKey = getAttribute( Xul.Attribute.LIST ); if( listKey == null ) return null; String list[] = XulManager.getXulManager().createList( listKey ); if( list == null ) Xul.warning( "list " + listKey + " not found" ); return list; } public XulMap getMap() { String mapKey = getAttribute( Xul.Attribute.MAP ); if( mapKey == null ) return null; XulMap map = XulManager.getXulManager().createMap( mapKey ); if( map == null ) Xul.warning( "map " + mapKey + " not found" ); return map; } public int getMaxHeight() { StyleSheet style = getStyle(); CssValue value = style.lookup( Css.Property.MAX_HEIGHT ); if( value == null ) return -1; if( value.getType() == CssValue.INTEGER ) return ( ( CssInteger ) value ).getIntegerValue(); else if( value.getType() == CssValue.PIXEL ) return ( int ) ( ( CssFloat ) value ).getFloatValue(); else { Xul.syntax( "unsupported value type for css property max-height" ); return -1; } } public int getMaxWidth() { StyleSheet style = getStyle(); CssValue value = style.lookup( Css.Property.MAX_WIDTH ); if( value == null ) return -1; if( value.getType() == CssValue.INTEGER ) return ( ( CssInteger ) value ).getIntegerValue(); else if( value.getType() == CssValue.PIXEL ) return ( int ) ( ( CssFloat ) value ).getFloatValue(); else { Xul.syntax( "unsupported value type for css property max-width" ); return -1; } } public int getMinHeight() { StyleSheet style = getStyle(); CssValue value = style.lookup( Css.Property.MIN_HEIGHT ); if( value == null ) return -1; if( value.getType() == CssValue.INTEGER ) return ( ( CssInteger ) value ).getIntegerValue(); else if( value.getType() == CssValue.PIXEL ) return ( int ) ( ( CssFloat ) value ).getFloatValue(); else { Xul.syntax( "unsupported value type for css property min-height" ); return -1; } } public int getMinWidth() { StyleSheet style = getStyle(); CssValue value = style.lookup( Css.Property.MIN_WIDTH ); if( value == null ) return -1; if( value.getType() == CssValue.INTEGER ) return ( ( CssInteger ) value ).getIntegerValue(); else if( value.getType() == CssValue.PIXEL ) return ( int ) ( ( CssFloat ) value ).getFloatValue(); else { Xul.syntax( "unsupported value type for css property min-width" ); return -1; } } public int getOrient( int defaultValue ) { String orient = getAttribute( Xul.Attribute.ORIENT ); if( orient == null ) return defaultValue; orient = orient.toLowerCase().trim(); if( orient.equals( "vertical" ) || orient.equals( "vert" ) ) return SwingConstants.VERTICAL; else return SwingConstants.HORIZONTAL; } public int getOrient() { return getOrient( SwingConstants.HORIZONTAL ); } public int getRowSpan() { return getIntAttribute( Xul.Attribute.ROWSPAN, 1 ); } public int getRows( int defaultValue ) { return getIntAttribute( Xul.Attribute.ROWS, defaultValue ); } public XPath getSelect( String defaultValue ) { // fix: either throw exception or // return prebuild empty xpath String expr = getAttribute( Xul.Attribute.SELECT, defaultValue ); XPath xpath = createXPath( expr ); if( xpath != null ) return xpath; // use default value as fallback if( !expr.equalsIgnoreCase( defaultValue ) ) { Xul.warning( "using default XPath expr '" + defaultValue + "' as a fallback" ); return createXPath( defaultValue ); } else return null; } public StyleSheet getStyle() { if( _style == null ) { String id = getId(); String clazz = getStyleClass(); String element = getElementName(); boolean hasId = id.equals( "anonymous" ); boolean hasClass = id.equals( "anonymous" ); StyleRegister styleRegister = StyleRegister.getStyleRegister(); if( hasId && hasClass ) _style = styleRegister.getStyleSheet( id, clazz, element ); else if( hasId ) _style = styleRegister.getStyleSheet( id, element ); else _style = styleRegister.getStyleSheet( element ); // check for inline style declaration String styleDeclaration = _element.getAttributeValue( Xul.Attribute.STYLE ); if( styleDeclaration != null ) { Map inlineProps = XulCssStyleDeclarationParser.parse( styleDeclaration ); _style = new StyleSheet( inlineProps, _style ); } } return _style; } /** * note, that I can't use simple getClass as this method is already used in * java.lang.Object */ public String getStyleClass() { return _styleClass; } public String getTooltip() { return getAttribute( Xul.Attribute.TOOLTIP ); } public String getValue() { return getAttribute( Xul.Attribute.VALUE ); } public int getWidth() { StyleSheet style = getStyle(); CssValue value = style.lookup( Css.Property.WIDTH ); if( value == null ) return -1; if( value.getType() == CssValue.INTEGER ) return ( ( CssInteger ) value ).getIntegerValue(); else if( value.getType() == CssValue.PIXEL ) return ( int ) ( ( CssFloat ) value ).getFloatValue(); else { Xul.syntax( "unsupported value type for css property width" ); return -1; } } private XPath createXPath( String expr ) { try { return new XPath( expr ); } catch( XPathSyntaxException sex ) { Xul.error( "syntax error in XPath expr '" + expr + "': " + sex.getMultilineMessage() ); } catch( JaxenException jex ) { Xul.error( "failed to create XPath expr '" + expr + "': " + jex.toString() ); } return null; } }
|
XulNode |
|