package com.rectang.xsm.pages.nav; import com.rectang.xsm.site.DocumentPage; import com.rectang.xsm.site.HierarchicalPage; import com.rectang.xsm.XSM; import com.rectang.xsm.pages.cms.Page; import java.util.List; import java.util.Vector; import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.PageParameters; import org.apache.wicket.ResourceReference; import org.apache.wicket.AttributeModifier; /** * The main CMS contents tab * * @author Andrew Williams * @version $Id: Contents.java 831 2011-09-25 12:59:18Z andy $ * @since 2.0 */ public class Contents extends Page { public Contents( PageParameters parameters ) { super( parameters ); } public void layout() { super.layout(); WebMarkupContainer label; HierarchicalPage parent = getXSMPage().getParent(); // check for the grandparent, as we don't want folk to get to the root parent if ( parent.getParent() != null ) { add( label = new WebMarkupContainer( "parent" ) ); PageParameters params = new PageParameters(); params.add( "page", parent.getPath() ); BookmarkablePageLink link = new BookmarkablePageLink( "parentlink", getClass(), params ); link.add( new Label( "parentlabel", parent.getTitle() ) ); label.add( link ); } else { add( (label = new WebMarkupContainer( "parent" )).setVisible( false ) ); } List childPages; if ( getXSMPage() instanceof HierarchicalPage ) { childPages = ((HierarchicalPage) getXSMPage()).getSubPages(); } else { childPages = new Vector(); } add( new Label( "childtext", new StringResourceModel( "childpages", label, new Model( getXSMPage() ) ) ) ); add( new ListView( "childpages", childPages ) { protected void populateItem( ListItem listItem ) { com.rectang.xsm.site.Page next = (com.rectang.xsm.site.Page) listItem.getModelObject(); listItem.add( new AttributeModifier( "class", new Model( (listItem.getIndex() % 2 == 1) ? "odd" : "even" ) ) ); generateListing( next, listItem ); } } ); add( new Label( "siblingtext", new StringResourceModel( "siblingpages", label, new Model( getXSMPage().getParent() ) ) ) ); add( new ListView( "siblingpages", getXSMPage().getParent().getSubPages() ) { protected void populateItem( ListItem listItem ) { com.rectang.xsm.site.Page next = (com.rectang.xsm.site.Page) listItem.getModelObject(); listItem.add( new AttributeModifier( "class", new Model( (listItem.getIndex() % 2 == 1) ? "odd" : "even" ) ) ); generateListing( next, listItem ); } } ); } private void generateListing( final com.rectang.xsm.site.Page page, ListItem panel ) { boolean canEdit; if ( page instanceof DocumentPage ) { canEdit = ((DocumentPage) page).getXSMDocument().canEdit( getXSMSession().getUser() ); } else { canEdit = getXSMSession().getUser().isSiteAdmin(); } String nextTitle = page.getTitle(); if ( page.getHidden() ) { nextTitle = "(" + nextTitle + ")"; } PageParameters subPage = new PageParameters(); subPage.add( "page", page.getPath() ); panel.add( new WebMarkupContainer( "page-icon" ).add( new AttributeModifier( "class", true, new Model() { public String getObject() { return "contenticon " + page.getType(); } } ) ) ); BookmarkablePageLink link = new BookmarkablePageLink( "link", getClass(), subPage ); link.add( new Label( "label", nextTitle ) ); panel.add( link ); Link showHide = new Link( "showhide" ) { public void onClick() { page.setHidden( !page.getHidden() ); getXSMSession().getSite().save(); boolean publish = true; HierarchicalPage parent = page.getParent(); while ( parent != null ) { if ( parent.getHidden() ) { publish = false; break; } parent = parent.getParent(); } if ( publish ) { // TODO perhaps report status on failure? getXSMSession().getSite().publish( getXSMSession().getUser() ); } } }; showHide.setVisible( canEdit ); if ( page.getHidden() ) { showHide.add( new Label( "label", new StringResourceModel( "show", panel, null ) ) ); } else { showHide.add( new Label( "label", new StringResourceModel( "hide", panel, null ) ) ); } panel.add( showHide ); Link top = new Link( "top" ) { public void onClick() { page.moveToTop(); getXSMSession().getSite().save(); if ( !page.getHidden() ) { getXSMSession().getSite().publish( getXSMSession().getUser() ); } setResponsePage( Contents.class, getPageNameParams() ); } }; top.setVisible( canEdit && panel.getIndex() > 0 ); panel.add( top ); top.add( new Image( "top-icon", new ResourceReference( XSM.class, "icons/go-top.png" ) ) ); Link up = new Link( "up" ) { public void onClick() { page.moveUp(); getXSMSession().getSite().save(); if ( !page.getHidden() ) { getXSMSession().getSite().publish( getXSMSession().getUser() ); } setResponsePage( Contents.class, getPageNameParams() ); } }; up.setVisible( canEdit && panel.getIndex() > 0 ); panel.add( up ); up.add( new Image( "up-icon", new ResourceReference( XSM.class, "icons/go-up.png" ) ) ); Link down = new Link( "down" ) { public void onClick() { page.moveDown(); getXSMSession().getSite().save(); if ( !page.getHidden() ) { getXSMSession().getSite().publish( getXSMSession().getUser() ); } setResponsePage( Contents.class, getPageNameParams() ); } }; down.setVisible( canEdit && panel.getIndex() < ((List) panel.getParent().getDefaultModelObject()).size() - 1 ); panel.add( down ); down.add( new Image( "down-icon", new ResourceReference( XSM.class, "icons/go-down.png" ) ) ); Link bottom = new Link( "bottom" ) { public void onClick() { page.moveToBottom(); getXSMSession().getSite().save(); if ( !page.getHidden() ) { getXSMSession().getSite().publish( getXSMSession().getUser() ); } setResponsePage( Contents.class, getPageNameParams() ); } }; bottom.setVisible( canEdit && panel.getIndex() < ((List) panel.getParent().getDefaultModelObject()).size() - 1 ); panel.add( bottom ); bottom.add( new Image( "bottom-icon", new ResourceReference( XSM.class, "icons/go-bottom.png" ) ) ); Link delete = new BookmarkablePageLink( "delete", Delete.class, subPage ); delete.setVisible( canEdit ); panel.add( delete ); delete.add( new Image( "delete-icon", new ResourceReference( XSM.class, "icons/edit-delete.png" ) ) ); Link rename = new BookmarkablePageLink( "rename", Rename.class, subPage ); rename.setVisible( canEdit ); panel.add( rename ); rename.add( new Image( "rename-icon", new ResourceReference( XSM.class, "icons/rename.png" ) ) ); } }