package com.rectang.xsm.pages.cms;
import com.rectang.xsm.doc.Type;
import com.rectang.xsm.doc.SupportedOption;
import com.rectang.xsm.site.DocumentPage;
import com.rectang.xsm.site.HierarchicalPage;
import com.rectang.xsm.site.Site;
import com.rectang.xsm.UserData;
import com.rectang.xsm.io.XSMDocument;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RadioGroup;
import org.apache.wicket.markup.html.form.Radio;
import org.apache.wicket.markup.html.form.TextField;
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.WebMarkupContainer;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.PageParameters;
import java.io.File;
import java.util.Iterator;
import org.jdom.Element;
/**
* The main CMS new tab
*
* @author Andrew Williams
* @version $Id: New.java 831 2011-09-25 12:59:18Z andy $
* @since 2.0
*/
public class New
extends Page
{
public New( PageParameters parameters )
{
super( parameters );
}
public void layout()
{
super.layout();
if ( hasError() )
{
return;
}
add( new NewForm( "newform" ) );
}
private class NewForm
extends Form
{
private String type = "html", name, level = "child";
public NewForm( String id )
{
super( id );
Site site = getXSMSession().getSite();
UserData user = getXSMSession().getUser();
WebMarkupContainer grouping =
new RadioGroup( "typegroup", new PropertyModel( this, "type" ) ).setRequired( true );
add( grouping );
grouping.add( new ListView( "types", Type.listTypes() )
{
protected void populateItem( ListItem listItem )
{
Type type = (Type) listItem.getModelObject();
boolean visible = !type.isHidden() && type.isSupportedBy( getXSMSession().getSite() );
listItem.add( new Radio( "type", new Model( type.getName() ) ) );
listItem.add( new Label( "typename", type.getName() ) );
listItem.add( new Label( "typelabel", type.getDescription() ) );
listItem.setVisible( visible );
}
} );
add( new TextField( "name", new PropertyModel( this, "name" ) ).setRequired( true ) );
add( grouping =
new RadioGroup( "levelgroup", new PropertyModel( this, "level" ) ).setRequired( true ) );
boolean canAddSibling = false;
if ( getXSMPage().getParent() != null )
{
if ( getXSMPage().getParent().equals( site.getRootPage() ) )
{
canAddSibling = user.isSiteAdmin();
}
else
{
if ( getXSMPage().getParent() instanceof DocumentPage )
{
canAddSibling = ((DocumentPage) getXSMPage().getParent()).getXSMDocument().canEdit( user );
}
else
{
canAddSibling = user.isSiteAdmin();
}
}
}
boolean canAddChild;
if ( getXSMPage().equals( site.getRootPage() ) )
{
canAddChild = user.isSiteAdmin();
}
else
{
canAddChild = (getXSMPage() instanceof HierarchicalPage) && canEdit();
}
grouping.add( new Radio( "siblinglevel", new Model( "sibling" ) ).setVisible( canAddSibling ) );
grouping.add( new Label( "siblingtext", new StringResourceModel( "level.sibling", this, new Model( getXSMPage() ) ) ) );
grouping.add( new Radio( "childlevel", new Model( "child" ) ).setVisible( canAddChild ) );
grouping.add( new Label( "childtext", new StringResourceModel( "level.child", this, new Model( getXSMPage() ) ) ) );
}
protected void onSubmit()
{
super.onSubmit();
Site site = getXSMSession().getSite();
UserData user = getXSMSession().getUser();
String file = XSMDocument.encode( name );
HierarchicalPage parent;
if ( level.equals( "sibling" ) )
{
parent = getXSMPage().getParent();
}
else
{
if ( !(getXSMPage() instanceof HierarchicalPage) )
{
getSession().error( "Cannot add a child page to a non-heirarchical parent" );
return;
}
parent = (HierarchicalPage) getXSMPage();
}
XSMDocument parentDoc = null;
if ( parent instanceof DocumentPage )
{
parentDoc = ((DocumentPage) parent).getXSMDocument();
}
if ( file.charAt( 0 ) == '_' )
{ /* spaces already converted */
warn( "Pages names cannot begin with the characters _& ?+/\"'" );
return;
}
String newPath = new File( parent.getPath(), file ).getPath();
com.rectang.xsm.site.Page existing = site.getPage( newPath );
if ( existing != null )
{
warn( "Page " + newPath + " already exists" );
return;
}
/* Add entry to contents for new page */
DocumentPage newPage = new DocumentPage( site, parent, name, true );
parent.addSubPage( newPage );
XSMDocument newDoc = XSMDocument.getXSMDoc( site, newPage, true );
if ( !site.save() )
{
fatal( "Error saving site, could not create new page" );
return;
}
/* Create new page */
newDoc.setContentElement( new Element( type ) );
/* having created the base structure we need to lock it */
newDoc.getRootElement().setAttribute( "lock", user.getUsername() );
newDoc.getRootElement().setAttribute( "owner", user.getUsername() );
/* If parent is of same type we copy options down */
if ( parentDoc != null && parentDoc.getContentElement().getName().equals( type ) )
{
Iterator options = parentDoc.getSupportedOptions( getXSMSession().getUser() ).iterator();
while ( options.hasNext() )
{
SupportedOption next = (SupportedOption) options.next();
String value = parentDoc.getOption( next.getName() );
if ( value != null )
{
newDoc.setOption( next.getName(), value );
}
}
}
if ( !newDoc.save( user, true ) )
{
fatal( "Could not create page " + newPath );
}
try
{
newDoc.add( "@0", "", getXSMSession().getUser() );
newDoc.save();
}
catch ( Exception e )
{
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
PageParameters params = new PageParameters();
params.add( "page", newPath );
setResponsePage( Edit.class, params );
}
public String getType()
{
return type;
}
public void setType( String type )
{
this.type = type;
}
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
public String getLevel()
{
return level;
}
public void setLevel( String level )
{
this.level = level;
}
}
}