package com.rectang.xsm.pages.cms;
import com.rectang.xsm.MetaData;
import com.rectang.xsm.site.Site;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.TextArea;
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.PageParameters;
import com.rectang.xsm.doc.SupportedOption;
import com.rectang.xsm.wicket.OptionPanel;
import org.apache.wicket.model.PropertyModel;
/**
* The main CMS options tab
*
* @author Andrew Williams
* @version $Id: Options.java 818 2010-05-30 14:04:21Z andy $
* @since 2.0
*/
public class Options
extends DocumentPage
{
private String oldPath;
private MetaData metadata;
public Options( PageParameters parameters )
{
super( parameters );
}
public void layout()
{
super.layout();
if ( hasError() )
{
return;
}
oldPath = getDocumentPage().getPublishedPath();
metadata = getDoc().getMetadata();
add( new OptionsForm( "optionsform" ) );
}
private class OptionsForm
extends Form
{
public OptionsForm( String id )
{
super( id );
final boolean canEdit = getDoc().canEdit( getXSMSession().getUser() );
add( new TextField( "title", new PropertyModel( metadata, "title" ) ) );
add( new TextArea( "description", new PropertyModel( metadata, "description" ) ) );
add( new TextField( "slug", new PropertyModel( this, "slug" ) ) );
add( new ListView<SupportedOption>( "options", getDoc().getSupportedOptions( getXSMSession().getUser() ) )
{
protected void populateItem( ListItem listItem )
{
SupportedOption option = (SupportedOption) listItem.getModelObject();
// TODO if canEdit we display edit fields instead of the text
// Make some SupportedOption wicket panels to drop in
listItem.add( new Label( "label", option.getDescription() ) );
if ( canEdit )
{
switch ( option.getType() )
{
case SupportedOption.TYPE_BOOL:
listItem.add( new OptionPanel.BooleanOption( "option", option, getDoc() ) );
break;
case SupportedOption.TYPE_INT:
listItem.add( new OptionPanel.IntegerOption( "option", option, getDoc() ) );
break;
default:
listItem.add( new OptionPanel.StringOption( "option", option, getDoc() ) );
}
}
else
{
switch ( option.getType() )
{
case SupportedOption.TYPE_BOOL:
listItem.add( new Label( "option", option.getBoolean( getDoc() ) ? "yes" : "no" ) );
break;
case SupportedOption.TYPE_INT:
listItem.add( new Label( "option", String.valueOf( option.getInteger( getDoc() ) ) ) );
break;
default:
listItem.add( new Label( "option", "\"" + option.getString( getDoc() ) + "\"" ) );
}
}
}
} );
Button save = new Button( "save" );
save.setVisible( canEdit );
add( save );
Button reset = new Button( "reset" );
reset.setVisible( canEdit );
add( reset );
}
public String getSlug()
{
return getDocumentPage().getSlug();
}
public void setSlug( String slug )
{
getDocumentPage().setSlug( slug );
}
protected void onSubmit()
{
super.onSubmit();
// TODO should we sanity check the slug (i.e. unique...)
metadata.save();
getDoc().save();
if ( !oldPath.equals( getDocumentPage().getPublishedPath() ) )
{
getDocumentPage().getSite().save();
rename();
oldPath = getDocumentPage().getPublishedPath();
getDocumentPage().getSite().publish( getXSMSession().getUser() );
}
else
{
getDoc().publish( getXSMSession().getUser() );
}
}
private void rename()
{
Site site = getDocumentPage().getSite();
if ( getXSMPage() instanceof com.rectang.xsm.site.DocumentPage )
{
// what to do if we fail?
site.getPublishedDoc( oldPath ).rename( getDocumentPage().getPublishedPath() );
}
}
}
}