package com.rectang.xsm.doc; import com.rectang.xsm.XSM; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.ResourceReference; import org.jdom.Element; import java.util.List; import java.util.Arrays; import java.util.Vector; public class DocChoice extends DocList { public DocChoice( String name, DocElement[] elements ) { super( name, elements ); } public void view( Element node, StringBuffer s ) { for ( int i = 0; i < elements.length; i++ ) { if ( elements[i] != null && node != null ) { Element possible = node.getChild( elements[i].getName() ); if ( possible != null ) { elements[i].view( possible, s ); return; } } } } public void publish( Element node, StringBuffer s ) { for ( int i = 0; i < elements.length; i++ ) { if ( elements[i] != null && node != null ) { Element possible = node.getChild( elements[i].getName() ); if ( possible != null ) { elements[i].publish( possible, s ); return; } } } } public WebMarkupContainer edit( String wicketId, Element node, String path ) { Panel ret = new ChoicePanel( wicketId, node, path ); return ret; } public void create( Element node ) { /* no more created here just now - all optional */ } public void destroy( Element node ) { for ( int i = 0; i < elements.length; i++ ) { if ( elements[i] != null && node != null ) { Element possible = node.getChild( elements[i].getName() ); if ( possible != null ) { elements[i].destroy( possible ); } } } } class ChoicePanel extends Panel { public ChoicePanel( final String wicketId, final Element node, final String path ) { super( wicketId ); boolean added = false; for ( int i = 0; i < elements.length; i++ ) { if ( elements[i] != null && node != null ) { Element possible = node.getChild( elements[i].getName() ); if ( possible != null ) { add( elements[i].edit( "content", possible, path + "/" + elements[i].getName() + "@0" ) ); added = true; continue; } } } if ( !added ) { add( new WebMarkupContainer( "content" ) ); } // only display the add links if we have not added content already List elementList = new Vector(); if ( !added ) { // TODO don't reconstruct this all the time elementList = Arrays.asList( elements ); } add( new ListView( "elements", elementList ) { protected void populateItem( ListItem listItem ) { final DocElement elem = (DocElement) listItem.getModelObject(); Link add; listItem.add( add = new Link( "add" ) { public void onClick() { Element child = new Element( elem.getName() ); node.addContent( child ); elem.create( child ); } } ); add.add( new Image( "add-icon", new ResourceReference( XSM.class, "icons/document-new.png" ) ) ); listItem.add( new Label( "add-label", getString( "add", new Model( elem ) ) ) ); listItem.add( new Label( "add-or", getString( "or" ) ).setVisible( listItem.getIndex() < ((List) listItem.getParent().getDefaultModelObject()).size() - 1 ) ); } } ); } } }