package com.rectang.xsm.doc; import com.rectang.xsm.site.DocumentPage; import com.rectang.xsm.io.XSMDocument; import com.rectang.xsm.UserData; import java.util.*; import org.jdom.Element; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Panel; public class DocList extends DocElement { public DocElement[] elements; public DocList( String name, DocElement[] elements ) { super( name ); this.elements = elements; } public void view( Element node, StringBuffer s ) { for ( int i = 0; i < elements.length; i++ ) { if ( elements[i] != null && node != null ) { elements[i].view( node.getChild( elements[i].getName() ), s ); s.append( "<br />\n" ); } } } public void publish( Element node, StringBuffer s ) { for ( int i = 0; i < elements.length; i++ ) { if ( elements[i] != null && node != null ) { elements[i].publish( node.getChild( elements[i].getName() ), s ); s.append( "<br />\n" ); } } } public WebMarkupContainer edit( String wicketId, final Element node, final String path ) { return edit( wicketId, node, path, null ); } public WebMarkupContainer edit( String wicketId, final Element node, final String path, final String hint ) { Panel ret = new ListPanel( wicketId, node, path, hint ); return ret; } public void create( Element node ) { Element created; for ( int i = 0; i < elements.length; i++ ) { node.addContent( created = new Element( elements[i].getName() ) ); elements[i].create( created ); } } public void destroy( Element node ) { for ( int i = 0; i < elements.length; i++ ) { if ( elements[i] != null && node != null ) { elements[i].destroy( node.getChild( elements[i].getName() ) ); } } } public DocElement getElement( String name ) { for ( int i = 0; i < elements.length; i++ ) { if ( elements[i].getName().equals( name ) ) { return elements[i]; } } return null; } /* methods needed to copy root data to all children in the list */ public void setUser( UserData user ) { super.setUser( user ); for ( int i = 0; i < elements.length; i++ ) { elements[i].setUser( user ); } } public void setPage( DocumentPage page ) { super.setPage( page ); for ( int i = 0; i < elements.length; i++ ) { elements[i].setPage( page ); } } public void setDoc( XSMDocument doc ) { super.setDoc( doc ); for ( int i = 0; i < elements.length; i++ ) { elements[i].setDoc( doc ); } } public List getSupportedOptions() { Vector ret = new Vector(); for ( int i = 0; i < elements.length; i++ ) { ret.addAll( elements[i].getSupportedOptions() ); } return ret; } class ListPanel extends Panel { public ListPanel( final String wicketId, final Element node, final String path, final String hint ) { super( wicketId ); add( new Label( "hint", hint ).setVisible( hint != null ) ); // TODO don't reconstruct this all the time List elementList = Arrays.asList( elements ); add( new ListView( "elements", elementList ) { protected void populateItem( ListItem listItem ) { DocElement elem = (DocElement) listItem.getModelObject(); if ( elem == null || node == null ) { listItem.add( new WebMarkupContainer( "content" ) ); listItem.setVisible( false ); return; } listItem.add( elem.edit( "content", node.getChild( elem.getName() ), path + "/" + elem.getName() + "@" + listItem.getIndex() ) ); } } ); } } }