I'm going mad.... I can't get this working.

Here is some code. It is quite a bit so

ItemListPage

package se.edgesoft.hairless.web.page.site.item;

import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.wicket.PageParameters;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.Radio;
import org.apache.wicket.markup.html.form.RadioGroup;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;

import se.edgesoft.hairless.entities.brand.Brand;
import se.edgesoft.hairless.entities.category.Category;
import se.edgesoft.hairless.entities.colorstory.ColorStory;
import se.edgesoft.hairless.entities.department.Department;
import se.edgesoft.hairless.entities.item.Item;
import se.edgesoft.hairless.entities.presentation.Presentation;
import se.edgesoft.hairless.entities.translation.Translation;
import se.edgesoft.hairless.model.filter.item.BalanceFilter;
import se.edgesoft.hairless.model.filter.item.BrandFilter;
import se.edgesoft.hairless.model.filter.item.CategoryFilter;
import se.edgesoft.hairless.model.filter.item.ColorStoryFilter;
import se.edgesoft.hairless.model.filter.item.DepartmentFilter;
import se.edgesoft.hairless.model.filter.item.GenderFilter;
import se.edgesoft.hairless.model.filter.item.ItemBreadcrumb;
import se.edgesoft.hairless.model.filter.item.ItemFilter;
import se.edgesoft.hairless.model.filter.item.ItemResourceBreadcrumb;
import se.edgesoft.hairless.model.filter.item.ObjectFilter;
import se.edgesoft.hairless.model.filter.item.OutletFilter;
import se.edgesoft.hairless.model.filter.item.Presentational;
import se.edgesoft.hairless.model.filter.item.StoreFilter;
import se.edgesoft.hairless.model.filter.item.TypePresentational;
import se.edgesoft.hairless.model.format.item.ItemFormatter;
import se.edgesoft.hairless.model.presentation.PresentationManager;
import se.edgesoft.hairless.model.sort.item.ItemSort;
import se.edgesoft.hairless.model.sort.item.Sort;
import se.edgesoft.hairless.model.translation.Translator;
import se.edgesoft.hairless.model.translation.TranslatorManager;
import se.edgesoft.hairless.web.components.ExternalImageUrl;
import se.edgesoft.hairless.web.components.models.TranslatableCategoryModel;
import
se.edgesoft.hairless.web.page.administration.renderers.BrandChoiceRenderer;
import
se.edgesoft.hairless.web.page.administration.renderers.CategoryChoiceRenderer;
import
se.edgesoft.hairless.web.page.administration.renderers.ColorStoryChoiceRenderer;
import se.edgesoft.hairless.web.page.site.RootPage;
import se.edgesoft.hairless.web.panels.ItemPageNavigation;

public class ItemListPage extends RootPage{
        
        List<ItemFilter> filters;
        List<ItemSort> sorts;
        private Presentation presentation;
        private Translation translation;
        
        public List<ItemFilter> getFilters() {
                return filters;
        }

        public void setFilters(List<ItemFilter> filters) {
                this.filters = filters;
                /**
                 * Check if the outlet filter exists. This can
                 * happen if the outlet is pressed
                 * If no outlet filter is present we add a new outlet filter
                 * to filter only the items that is in date scope.
                 */
                if( ! containsFilter( OutletFilter.class ) ){
                        addFilter( new OutletFilter( false ));
                }
                /** Always add balance and store filter when getting items */
                if( ! containsFilter( BalanceFilter.class ) ){
                        addFilter( new BalanceFilter( new Long( 1 ) ));
                }
                /** Add store filter */
                if( ! containsFilter( StoreFilter.class ) ){
                        addFilter( new StoreFilter( getStore() ) );
                }
                /**
                 * Add default family as gender filter
                 */
                if( ! containsFilter( GenderFilter.class ) ){
                        addFilter( new GenderFilter( Item.Gender.FAMILY ) );
                }
                
        }
        
        public List<ItemBreadcrumb> getBreadCrumbs(){
                
                if( getFilters() == null || getFilters().isEmpty() ) return 
null;
                
                ItemFilter f = getFilters().get(0);
                
                List<ItemBreadcrumb> itemBreadcrumbs = new 
LinkedList<ItemBreadcrumb>();
                for( ItemFilter filter : getFilters() ){
                        if( filter instanceof ItemBreadcrumb ){
                                if( filter instanceof OutletFilter ){
                                        /** 
                                         * Don't append outlet filter
                                         * unless it is outlet true. This means 
that the outlet
                                         * has been requested. Otherwise, we 
will always have
                                         * a filter to exlude outlets, outlet 
false
                                         */
                                        if( ! ((OutletFilter) 
filter).isOutlet() ){
                                                continue;
                                        }
                                }
                                /**
                                 * Don't include Gender as breadcrumb unless it 
is the first filter.
                                 * This means that a direct request has been 
made for gender.
                                 * @see RootPage( maleLink, femaleLink, 
juniorLink )
                                 */
                                if( filter instanceof GenderFilter ){
                                        if( ! filter.equals( f )){
                                                continue;
                                        }
                                }
                                itemBreadcrumbs.add( (ItemBreadcrumb) filter );
                        }
                }
                
                return itemBreadcrumbs;
        }

        public List<ItemFilter> getFiltersByBreadcrumb( ItemBreadcrumb 
breadcrumb
){
                List<ItemFilter> filters = new LinkedList<ItemFilter>();
                for( ItemFilter filter : getFilters()  ){
                        filters.add( filter );
                        if( filter instanceof ItemBreadcrumb ){
                                if( ((ItemBreadcrumb) filter).equals( 
breadcrumb ) ){
                                        break;
                                }
                        }
                }
                return filters;
        }
        
        public ItemListPage( List<ItemFilter> filters){
                this( filters, null );
        }
        public ItemListPage( List<ItemFilter> filters, Sort sort ){
                if( sort != null) getItemListSetting().setSort(sort);
                
                setFilters( filters );

                IModel colorStoryModel = new LoadableDetachableModel(){
                        private static final long serialVersionUID = 1L;
                        @Override
                        protected Object load() {
                                return 
getItemDao().getColorStories(getFilters());
                        }
                };
                
                IModel brandModel = new LoadableDetachableModel(){
                        private static final long serialVersionUID = 1L;
                        @Override
                        protected Object load() {
                                return getItemDao().getBrands(getFilters());
                        }
                };
                IModel categoryModel = new TranslatableCategoryModel( 
getStore(), filters
);
                
                Form itemFilterForm = new Form( "itemFilterForm" );

                final DropDownChoice brandChoice = new 
DropDownChoice("brandChoice", new
Model(), brandModel,new BrandChoiceRenderer()){
                        private static final long serialVersionUID = 1L;

                        @Override
                        protected boolean wantOnSelectionChangedNotifications(){
                                return true;
                        }
                        
                        @Override
                        protected void onSelectionChanged(Object newSelection ){
                                if( newSelection == null ){
                                        removeFilter( BrandFilter.class );
                                }else{
                                        /**
                                         * If the filter list contains a brand 
filter
                                         * find the filter and replace it. It 
is critical
                                         * that the filter is at the same 
position due
                                         * to bread crumbs and null valid drop 
down lists.
                                         */
                                        if( containsFilter( BrandFilter.class 
)){
                                                for( ItemFilter filter : 
getFilters() ){
                                                        if( filter instanceof 
BrandFilter ){
                                                                
getFilters().set( getFilters().indexOf( filter ), new
BrandFilter((Brand) newSelection));
                                                                break;
                                                        }
                                                }
                                        }else{
                                                addFilter( new 
BrandFilter((Brand) newSelection));
                                        }
                                        
                                }
                                setResponsePage( new ItemListPage( getFilters() 
));
                        }
                };
                
                final DropDownChoice categoryChoice = new 
DropDownChoice("categoryChoice",
new Model(), categoryModel,new CategoryChoiceRenderer()){
                        private static final long serialVersionUID = 1L;
                        @Override
                        protected boolean wantOnSelectionChangedNotifications(){
                                return true;
                        }
                        
                        @Override
                        protected void onSelectionChanged(Object newSelection ){
                                if( newSelection == null ){
                                        removeFilter( CategoryFilter.class );
                                }else{
                                        /**
                                         * If the filter list contains a 
category filter
                                         * find the filter and replace it. It 
is critical
                                         * that the filter is at the same 
position due
                                         * to bread crumbs and null valid drop 
down lists.
                                         */
                                        if( containsFilter( 
CategoryFilter.class )){
                                                for( ItemFilter filter : 
getFilters() ){
                                                        if( filter instanceof 
CategoryFilter ){
                                                                
getFilters().set( getFilters().indexOf( filter ), new
CategoryFilter((Category) newSelection));
                                                                break;
                                                        }
                                                }
                                        }else{
                                                addFilter(  new 
CategoryFilter((Category) newSelection) );
                                        }
                                }
                                setResponsePage( new ItemListPage( getFilters() 
));
                        }

                };
                
                final DropDownChoice colorStoryChoice = new
DropDownChoice("colorStoryChoice", new Model(), colorStoryModel,new
ColorStoryChoiceRenderer()){
                        private static final long serialVersionUID = 1L;
                        @Override
                        protected boolean wantOnSelectionChangedNotifications(){
                                return true;
                        }
                        
                        @Override
                        protected void onSelectionChanged(Object newSelection ){
                                if( newSelection == null ){
                                        removeFilter( ColorStoryFilter.class );
                                }else{
                                        /**
                                         * If the filter list contains a 
category filter
                                         * find the filter and replace it. It 
is critical
                                         * that the filter is at the same 
position due
                                         * to bread crumbs and null valid drop 
down lists.
                                         */
                                        if( containsFilter( 
ColorStoryFilter.class )){
                                                for( ItemFilter filter : 
getFilters() ){
                                                        if( filter instanceof 
ColorStoryFilter ){
                                                                
getFilters().set( getFilters().indexOf( filter ), new
ColorStoryFilter((ColorStory) newSelection));
                                                                break;
                                                        }
                                                }
                                        }else{
                                                addFilter(  new 
ColorStoryFilter((ColorStory) newSelection) );
                                        }
                                }
                                setResponsePage( new ItemListPage( getFilters() 
));
                        }

                };
                final DropDownChoice sortChoice = new DropDownChoice( 
"sortChoice", new
Model( getItemListSetting().getSort() ),  Arrays.asList( Sort.values() ),new
ChoiceRenderer(){
                                public Object getDisplayValue(Object object) {
                                        return new 
StringResourceModel(((Sort)object).getResourceKey(),
ItemListPage.this, new Model() ).getString();
                                }
                                public String getIdValue(Object key, int index) 
{
                                        return ((Sort)key).getName();
                                }
                        }){
                        private static final long serialVersionUID = 1L;
                        @Override
                        protected boolean wantOnSelectionChangedNotifications(){
                                return true;
                        }
                        
                        @Override
                        protected void onSelectionChanged(Object newSelection ){
                                Sort newSort = (Sort) newSelection;
                                getItemListSetting().setSort( newSort );
                                setResponsePage( new ItemListPage( getFilters() 
));
                        }
                };
                
                colorStoryChoice.setNullValid( true );
                brandChoice.setNullValid( true );
                categoryChoice.setNullValid( true );
                sortChoice.setNullValid( false );
                
                if( getFilters() != null && ! getFilters().isEmpty() ){
                        ItemFilter f = getFilters().get(0);
                        for( ItemFilter filter : getFilters() ){
                                if( filter instanceof ObjectFilter ){
                                        if( filter instanceof BrandFilter ){
                                                brandChoice.setModelObject( 
((ObjectFilter) filter).getFilterObject()
);
                                                if( filter.equals( f ) ){
                                                        
brandChoice.setNullValid( false );
                                                }
                                        }
                                        if( filter instanceof CategoryFilter ){
                                                categoryChoice.setModelObject( 
((ObjectFilter)
filter).getFilterObject() );
                                                if( filter.equals( f )  ){
                                                        
categoryChoice.setNullValid( false );
                                                }
                                        }
                                        
                                        if( filter instanceof ColorStoryFilter 
){
                                                
colorStoryChoice.setModelObject( ((ObjectFilter)
filter).getFilterObject() );
                                        }
                                }
                        }
                }
                categoryChoice.setEscapeModelStrings( false );
                itemFilterForm.add( colorStoryChoice );
                itemFilterForm.add( categoryChoice );
                itemFilterForm.add( brandChoice );
                itemFilterForm.add( sortChoice );
                
                itemFilterForm.add( new ListView( "genderList",
Arrays.asList(Item.Gender.values()) ){
                        private static final long serialVersionUID = 1L;

                        @Override
                        protected void populateItem(ListItem genderItem) {
                                Item.Gender gender = (Item.Gender) 
genderItem.getModelObject();
                                
                                Link genderLink = new Link( "genderLink" , 
genderItem.getModel() ){
                                        private static final long 
serialVersionUID = 1L;

                                        @Override
                                        public void onClick() {
                                                /** This should always occur */
                                                if( containsFilter( 
GenderFilter.class )){
                                                        for( ItemFilter filter 
: getFilters() ){
                                                                if( filter 
instanceof GenderFilter ){
                                                                        
getFilters().set( getFilters().indexOf( filter ), new GenderFilter(
(Item.Gender) getModelObject() ) );
                                                                        break;
                                                                }
                                                        }
                                                }
                                                setResponsePage( new 
ItemListPage( getFilters() ));
                                        }
                                        
                                };
                                

                                genderLink.add(getGenderImage(gender) );
                                genderItem.add( genderLink );
                        }
                        
                });
                
                ListView breadcrumbs = new ListView( "breadcrumbs" , 
getBreadCrumbs() ){
                        private static final long serialVersionUID = 1L;

                        @Override
                        protected void populateItem(ListItem listItem ) {
                                
                                ItemBreadcrumb breadcrumb = (ItemBreadcrumb) 
listItem.getModelObject();
                                
                                Link link = new Link( "breadcrumbLink" , 
listItem.getModel() ){
                                        private static final long 
serialVersionUID = 1L;

                                        @Override
                                        public void onClick() {
                                                setResponsePage( new 
ItemListPage( getFiltersByBreadcrumb(
(ItemBreadcrumb) getModelObject() ) ));
                                        }
                                        
                                };
                                
                                String linkData = "";
                                if( breadcrumb instanceof 
ItemResourceBreadcrumb){
                                        linkData = new StringResourceModel( 
breadcrumb.getName() ,
ItemListPage.this, new Model()).getString();
                                }else{
                                        linkData =  breadcrumb.getName();
                                }
                                if( ! ( listItem.getIndex() == 
getBreadCrumbs().size() - 1 ) ){
                                        linkData += " / ";
                                }
                                
                                link.add( new Label( "breadcrumbLabel" , 
linkData ));
                                listItem.add(link); 
                        }
                        
                };

                itemFilterForm.add( breadcrumbs );
        
                final DataView itemRepeater = new DataView( "itemRepeater", new
ItemProvider(), getItemListSetting().getListSize().intValue() ) {
                        private static final long serialVersionUID = 1L;
                        private Translator translator = new Translator( 
getStore() );
                        @Override
                        protected void populateItem( 
org.apache.wicket.markup.repeater.Item
listItem ) {
                                se.edgesoft.hairless.entities.item.Item item =
(se.edgesoft.hairless.entities.item.Item) listItem.getModelObject();
                                translator.translate( item );
                                new ItemFormatter( item, true ).format( 
getStore() );
                                
                                
                                Link itemLink = new Link( "itemLink", 
listItem.getModel() ){
                                        private static final long 
serialVersionUID = 1L;

                                        @Override
                                        public void onClick() {
                                                PageParameters parameters = new 
PageParameters();
                                                parameters.add( "ItemId",
((se.edgesoft.hairless.entities.item.Item)getModelObject()).getId().toString());
                                                setResponsePage(  new ItemPage( 
parameters, ItemListPage.this ) );
                                        }
                                        
                                };
                                
                                listItem.add( itemLink );

                                ExternalImageUrl imageUrl = new 
ExternalImageUrl( "image" ,
"ItemResourceServlet?itemId=" + item.getId() );
                                imageUrl.appendAlternate( 
item.getBrand().getName() + " " + 
item.getName()  );
                                itemLink.add( imageUrl );

                                itemLink.add( new ListView( "genderList", 
item.getGenderList() ){
                                        private static final long 
serialVersionUID = 1L;

                                        @Override
                                        protected void populateItem(ListItem 
genderItem) {
                                                Item.Gender gender = 
(Item.Gender) genderItem.getModelObject();
                                                switch( gender ){
                                                        case MALE:
                                                                genderItem.add( 
new ExternalImageUrl( "gender",  new
StringResourceModel( "item.gender.male.image" , ItemListPage.this, new
Model()).getString() )  );
                                                        break;
                                                                case FEMALE:
                                                                genderItem.add( 
new ExternalImageUrl( "gender", new
StringResourceModel( "item.gender.female.image" , ItemListPage.this, new
Model()).getString()  ) );
                                                                break;
                                                        case JUNIOR:
                                                                genderItem.add( 
new ExternalImageUrl( "gender", new
StringResourceModel( "item.gender.junior.image" , ItemListPage.this, new
Model()).getString()  ) );
                                                                break;
                                                }
                                        }
                                        
                                });

                                itemLink.add(  new Label( "brandName", 
item.getBrand().getName() ));
                                itemLink.add(  new Label( "name", 
item.getName() ));
                                itemLink.add(  new Label( "collection",
item.getCollection().getIdentifier() ));
                                itemLink.add(  new ExternalImageUrl( 
"brandLogo" , 
item.getBrand().getLogo().getFile() ) );
                                 
                                
                                
                                Label sale = new Label( "sale" , new 
StringResourceModel( "sale.label" ,
ItemListPage.this, new Model()).getString()  );
                                itemLink.add( sale );
                                
                                if( item.isOnSale() ){
                                        itemLink.add( new ItemSaleFragment( 
"pricePanel" , "itemSaleFragment",
item ) );
                                }else{
                                        itemLink.add( new ItemNoSaleFragment( 
"pricePanel" ,
"itemNoSaleFragment", item ) );
                                        sale.setVisible( false );
                                }
                        }
        };
        
        add( itemFilterForm );
        add(itemRepeater);
        add(new ItemPageNavigation("itemTopNavigation", itemRepeater));
        add(new ItemPageNavigation("itemBottomNavigation", itemRepeater));
        extractOverviewData();
        
        setBackground( presentation );

        
        
        WebMarkupContainer descriptionContainer = new WebMarkupContainer(
"descriptionContainer" );
        
        if( this.translation != null ){
                Label headline = new Label( "headline" , 
this.translation.getName()
);
                Label description = new Label( "description" ,
this.translation.getShortDescription() );
                
                if( this.presentation != null ){
                        
                        if( presentation.getTextColor() != null )
                        description.add( new AttributeAppender( "style", true , 
new
Model("color: "+  presentation.getTextColor() +";"  ), ""));
                        if( presentation.getHeadlineColor() != null )
                        headline.add( new AttributeAppender( "style", true , new
Model("color: "+  presentation.getHeadlineColor() +";"  ), ""));
                        if( presentation.getOverviewImage() != null )
                                descriptionContainer.add( new 
AttributeAppender( "style", true,
new Model( "background-image: url( " +
presentation.getOverviewImage().getFile() + "); background-repeat:
no-repeat;" ) , ""  ));

                }
                descriptionContainer.add( description );
                descriptionContainer.add( headline );
                
        }else{
                descriptionContainer.add( new Label( "headline" , "" ));
                descriptionContainer.add( new Label( "description" , "" ));
        }
        
        add( descriptionContainer );
        

        
        final RadioGroup productsPerPage = new RadioGroup(
"productsPerPage", new Model( getItemListSetting().getListSize() ) ){
                        private static final long serialVersionUID = 1L;

                        @Override
                        protected boolean wantOnSelectionChangedNotifications(){
                                return true;
                        }
                        
                        @Override
                        protected void onSelectionChanged(Object newSelection ){
                                getItemListSetting().setListSize( (Long) 
newSelection );
                                setResponsePage( new ItemListPage( getFilters() 
));
                        }
        };
        

        productsPerPage.add(new Radio("16", new Model( new Long( 16 ) )));
        productsPerPage.add(new Radio("24",  new Model(new Long( 24 ) )));
        productsPerPage.add(new Radio("32", new Model(new Long( 32 ))));

        itemFilterForm.add( productsPerPage );
        }
        
        private ExternalImageUrl getGenderImage( Item.Gender gender ){
                Item.Gender selectedGender = null;
                String resource = "";
                for( ItemFilter filter : getFilters() ){
                        if( filter instanceof GenderFilter ){
                                selectedGender = (( GenderFilter) filter 
).getGender();
                                break;
                                
                        }
                }
                switch( gender ){
                        case MALE:
                                if( selectedGender != null && 
selectedGender.equals( Item.Gender.MALE
)){
                                        resource = "gender.male.image.selected";
                                }else{
                                        resource = "gender.male.image";
                                }
                                
                                break;
                        case FEMALE:
                                if( selectedGender != null && 
selectedGender.equals( Item.Gender.FEMALE
)){
                                        resource = 
"gender.female.image.selected";
                                }else{
                                        resource = "gender.female.image";
                                }
                                break;
                        case JUNIOR:
                                if( selectedGender != null && 
selectedGender.equals( Item.Gender.JUNIOR
)){
                                        resource = 
"gender.junior.image.selected";
                                }else{
                                        resource = "gender.junior.image";
                                }
                                break;
                        case FAMILY:
                                if( selectedGender != null && 
selectedGender.equals( Item.Gender.FAMILY
)){
                                        resource = 
"gender.family.image.selected";
                                }else{
                                        resource = "gender.family.image";
                                }
                                break;
                }
                
                return new ExternalImageUrl( "genderImage",  new 
StringResourceModel(
resource , ItemListPage.this, new Model()).getString()   );
        }

        @SuppressWarnings( "unchecked" )
        class ItemProvider implements IDataProvider{
                private static final long serialVersionUID = 1L;

                public Iterator iterator(int first, int count) {
                  return getItemDao().getItems(getFilters(), Arrays.asList(
getItemListSetting().getSort() ), first, count ).iterator();
                }
                
                public int size() {
                        return getItemDao().getItemCount( getFilters());
                }

                public IModel model(Object object) {
                  return new Model((Item) object); 
                }

                        public void detach() {
                                
                        }
     }

        public void extractOverviewData(){
                if( getFilters() != null && ! getFilters().isEmpty() ){
                        ItemFilter filter = getFilters().get(0);
                        if( filter instanceof Presentational ){
                                if( filter instanceof TypePresentational ){
                                        this.presentation = new 
PresentationManager( getStore()
).getPresentation(((TypePresentational) filter ).getPresentationType() );
                                        this.translation = new 
TranslatorManager( getStore()
).getTranslation(((TypePresentational) filter ).getTranslationType() );
                                }
                                if( filter instanceof ObjectFilter ){
                                        if( filter instanceof BrandFilter ){
                                                this.presentation = new 
PresentationManager( getStore()
).getPresentation((Brand)((ObjectFilter) filter ).getFilterObject() );
                                                this.translation = new 
TranslatorManager(
getStore()).getTranslation((Brand)((ObjectFilter) filter
).getFilterObject());
                                        }
                                        if( filter instanceof CategoryFilter ){
                                                this.presentation = new 
PresentationManager( getStore()
).getPresentation((Category)((ObjectFilter) filter ).getFilterObject() );
                                                this.translation = new 
TranslatorManager(
getStore()).getTranslation((Category)((ObjectFilter) filter
).getFilterObject());
                                        }
                                        
                                        if( filter instanceof DepartmentFilter 
){
                                                this.presentation = new 
PresentationManager( getStore()
).getPresentation((Department)((ObjectFilter) filter ).getFilterObject() );
                                                this.translation = new 
TranslatorManager(
getStore()).getTranslation((Department)((ObjectFilter) filter
).getFilterObject());
                                        }
                                }
                        }
                }

        }
        
        final class ItemSaleFragment extends Fragment{
                private static final long serialVersionUID = 1L;

                public ItemSaleFragment( String panel, String id, Item item ){
                        super( panel, id, ItemListPage.this );
                        add( new Label( "price" , 
item.getFormattedPriceString() ) );
                        add( new Label( "sale" ,  new StringResourceModel( 
"item.sale.label" ,
ItemListPage.this, new Model(), new Object[]{
item.getFormattedMemberPriceString() }  ).getString()  ));
                }
        }
        
        final class ItemNoSaleFragment extends Fragment{
                private static final long serialVersionUID = 1L;

                public ItemNoSaleFragment( String panel, String id, Item item ){
                        super( panel, id, ItemListPage.this );
                        add( new Label( "price" , new StringResourceModel( 
"item.member.label" ,
ItemListPage.this, new Model(), new Object[]{
item.getFormattedMemberPriceString() }  ).getString()   ));
                }
        }
        
        @SuppressWarnings( "unchecked" )
        public boolean containsFilter( Class clazz ){
                Iterator<ItemFilter> iter = getFilters().iterator();
                 while( iter.hasNext() ){
                         ItemFilter filter = (ItemFilter)iter.next();
                         if( clazz.equals( filter.getClass() )){
                                 return true;
                         }
                 }
                 
                 return false;
        }
        
        @SuppressWarnings( "unchecked" )
        public void removeFilter( Class clazz ){
                 Iterator<ItemFilter> iter = getFilters().iterator();
                 while( iter.hasNext() ){
                         ItemFilter filter = (ItemFilter)iter.next();
                         
                         if( clazz.equals( filter.getClass() )){
                                 iter.remove();
                                 break;
                         }
                 }
        }
        
        public void addFilter( ItemFilter f ){
                removeFilter( f.getClass() );
                getFilters().add( f );
        }
}


Item page. The page holding a reference back to ItemPage
package se.edgesoft.hairless.web.page.site.item;


import java.io.File;
import java.io.Serializable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.apache.wicket.PageParameters;
import org.apache.wicket.RestartResponseAtInterceptPageException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.basic.MultiLineLabel;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;

import se.edgesoft.hairless.entities.cart.Cart;
import se.edgesoft.hairless.entities.cart.CartItem;
import se.edgesoft.hairless.entities.category.MainCategory;
import se.edgesoft.hairless.entities.category.SubCategory;
import se.edgesoft.hairless.entities.item.Item;
import se.edgesoft.hairless.entities.item.SubItem;
import se.edgesoft.hairless.entities.item.attribute.Attribute;
import se.edgesoft.hairless.entities.item.image.Image;
import se.edgesoft.hairless.entities.item.image.ImageResource;
import se.edgesoft.hairless.entities.presentation.Presentation;
import se.edgesoft.hairless.entities.presentation.brand.BrandPresentation;
import se.edgesoft.hairless.entities.translation.brand.BrandTranslation;
import se.edgesoft.hairless.model.format.item.ItemFormatter;
import
se.edgesoft.hairless.model.image.processing.ItemImageProcessing.JpegSize;
import se.edgesoft.hairless.model.presentation.PresentationManager;
import se.edgesoft.hairless.model.translation.Translator;
import se.edgesoft.hairless.web.components.ExternalImageUrl;
import se.edgesoft.hairless.web.page.site.Base;
import se.edgesoft.hairless.web.page.site.RootPage;
import se.edgesoft.hairless.web.panels.item.ItemBackPanel;

/**
 * @author Mathias Nilsson
 */
public class ItemPage extends RootPage {
        Long itemId;
        Item item;
        WebPage backPage;
        private Translator translator;
        private WebMarkupContainer largeImageContainer;
        
        public ItemPage(){
                throw new RestartResponseAtInterceptPageException(Base.class);
        }
        
        public ItemPage(  PageParameters parameters ){
                this( parameters , null );
        }

        public ItemPage( PageParameters parameters, WebPage backPage  ){
                
                this.backPage = backPage;
                
                try{
                        itemId = new Long( parameters.getString( "ItemId", "" ) 
);
                }catch( NumberFormatException nex ){
                        throw new 
RestartResponseAtInterceptPageException(Base.class);
                }
                translator = new Translator( getStore() );
                item = getItemDao().getItem( itemId );
                translator.translate( item );
                new ItemFormatter( item ).format( getStore() );
                
                
                if( item == null )throw new
RestartResponseAtInterceptPageException(Base.class);
        
                IModel cartItemsModel = new LoadableDetachableModel(){
                        private static final long serialVersionUID = 1L;

                        @Override
                        protected Object load() {
                                List<SubItem> subItems = 
getItemDao().getSubItems(item);
                                List<CartListItem> cartItems = new 
LinkedList<CartListItem>();
                                
                                for( SubItem subItem : subItems ){
                                        if( subItem.getBalance() > 0 ){
                                                StringBuffer buf = new 
StringBuffer();
                                                for( Attribute attribute : 
subItem.getAttributes() ){
                                                        buf.append( 
attribute.getData() + " : " );
                                                }
                                                
                                                if( buf.length() > 0 ){
                                                        buf.delete(buf.length() 
- 3, buf.length() );
                                                }
                                                
                                                CartListItem item = new 
CartListItem();
                                                item.setSubItem(subItem);
                                                item.setAttribute( 
buf.toString() );
                                                cartItems.add( item );
                                                
                                        }
                                }
                                return cartItems;
                        }
                        
                };
                
                IModel itemImageModel = new LoadableDetachableModel(){
                        private static final long serialVersionUID = 1L;

                        @Override
                        protected Object load() {
                                List<Image> images =  getItemDao().getImages( 
item );
                                
                                int length = images.size();
                                
                                for( int i = length; i <= 5; i ++ ){
                                        images.add( new Image() );
                                }
                                
                                if( images.size() > 6 ){
                                        Iterator iter = images.iterator();
                                        int c = 0;
                                        while( iter.hasNext() ){
                                                iter.next();
                                                
                                                if( c > 5 ) iter.remove();
                                                c++;
                                        }
                                }
                                
                                return images;
                        }
                        
                };
                
                final DropDownChoice choice = new DropDownChoice( "subItems", 
new Model(),
cartItemsModel, new ChoiceRenderer( "attribute", "subItem.id" ) );
                choice.setNullValid( true );
                Form itemForm = new Form( "itemForm" );
                
                AjaxButton addToCart = new AjaxButton( "addToCart", itemForm ){
                        private static final long serialVersionUID = 1L;

                        @Override
                        public void onSubmit( AjaxRequestTarget target, Form 
form ) {
                                if( choice.getModelObject() instanceof 
CartListItem ){
                                        
                                        Cart cart = getCart();
                                        CartItem item = new CartItem();
                                        item.setAmount( new Long( 1 ) );
                                        item.setSubItem( ((CartListItem) 
choice.getModelObject() ).getSubItem()
);
                                        cart.addCartItem( item );
                                        getCartDao().updateCart( cart );
                                        
                                        PageParameters params = new 
PageParameters();
                                        params.add( "ItemId", itemId.toString() 
);
                                        
                                        updateCart( target );
                                        
                                        //setResponsePage( new ItemPage( 
params, getBackPage() ) );
                                }
                        }
                        
                };
                addToCart.setOutputMarkupId( true );
                itemForm.add( addToCart );
                itemForm.add( choice );
                add( itemForm );
                 
                 
                
                 
                 
                 add(  new ExternalImageUrl( "brandLogo" ,
item.getBrand().getLogo().getFile() ) );
                 
                 add( new ListView( "itemImages" , itemImageModel ){
                        private static final long serialVersionUID = 1L;

                        @Override
                        protected void populateItem(ListItem listItem ) {
                                
                                Image image = (Image) listItem.getModelObject();
                                ImageResource resource = null;
                                ExternalImageUrl imageUrl = null;
                                if( image.getId() != null ){
                                        for( ImageResource img : 
image.getImageResources() ){
                                                if( img.getJpegSize().equals( 
JpegSize.SMALL )){
                                                        resource = img;
                                                        break;
                                                }
                                        }
                                }
                                if( resource != null && new File(
getHairlessApplicationSettings().getFileResourcePath(),resource.getFileResource().getFile()
).exists() ){
                                        imageUrl = new ExternalImageUrl( 
"image" ,
resource.getFileResource().getFile() );
                                }else{
                                        imageUrl = new ExternalImageUrl( 
"image" ,
"images/site/empty_small.jpg" );
                                        
                                }
                                imageUrl.appendAlternate( 
item.getBrand().getName() + " " + 
item.getName()  );
                                AjaxLink link = new AjaxLink( "imageLink", new 
Model( image ) ){
                                        private static final long 
serialVersionUID = 1L;

                                        @Override
                                        public void onClick(AjaxRequestTarget 
target ) {
                                                
                                                target.addComponent( 
largeImageContainer );
                                                updateLargeImage( (Image) 
getModelObject() );
                                        }
                                        
                                };
                                link.add( imageUrl );
                                if( resource == null ) link.setEnabled( false );
                                
                                listItem.add( link );
                        }
                         
                 });
                 
                 largeImageContainer = new WebMarkupContainer( 
"largeImageContainer" );
                 largeImageContainer.setOutputMarkupId( true );
                 largeImageContainer.addOrReplace( new ExternalImageUrl( 
"largeImage" , ""
) );

                 List<Image> images = (List) itemImageModel.getObject();
                 if( images != null && images.size() > 0 ){
                         updateLargeImage( images.get( 0 ));
                 }
                 
                 add( largeImageContainer );
                 
                 add( new Label( "name" , item.getName() ));
                 add( new Label( "fullName" , item.getBrand().getName() + " " +
item.getName() ));
                 add( new Label( "collection" , 
item.getCollection().getIdentifier() ));
                 
                 SubCategory subCategory = item.getSubCategory();
                 MainCategory mainCategory = subCategory.getParent();
                 translator.translate(mainCategory);
                 translator.translate(subCategory);
                
                 add( new MultiLineLabel( "shortDescription", 
item.getShortDescription() 
));
                 
                 
                // add( new Label( "priceLabel" ,  new StringResourceModel(
"item.label.price" , ItemPage.this, new Model()).getString()  ));
                 
                 WebMarkupContainer brandPromotionContainer = new 
WebMarkupContainer(
"brandPromotionContainer" );
                 BrandPresentation brandPresentation =
getPresentationDao().getPresentation( getStore(),item.getBrand( ));
                 BrandTranslation brandTranslation = 
getTranslationDao().getTranslation(
getStore(),item.getBrand());
                 brandPromotionContainer.add( new ExternalImageUrl( 
"promotionImage" ,
brandPresentation.getPromotionImage().getFile() ));
                 brandPromotionContainer.add(  new ExternalImageUrl( 
"brandLogo" , 
item.getBrand().getLogo().getFile() ) );
                 
                 brandPromotionContainer.add( new ExternalLink( "brandLink" ,
item.getBrand().getLink(), item.getBrand().getLink().replaceAll( "http://";,
"") ));
                 brandPromotionContainer.add( new MultiLineLabel( 
"brandPromotionText",
brandTranslation.getPromotionText() ) ); 
                 
                 add( brandPromotionContainer );
                 
                 Presentation presentation = new PresentationManager( getStore()
).getPresentation( item.getBrand() );
                 setBackground( presentation );
                 
                 add( new ItemBackPanel( "upperBackPanel" , item, getBackPage() 
));
                 add( new ItemBackPanel( "lowerBackPanel" , item, getBackPage() 
));
        }
        
        public void updateLargeImage( Image image ){
                ImageResource resource = null;
                if( image.getId() != null ){
                        resource = getItemDao().getImageResource( image.getId() 
, JpegSize.LARGE
);
                }
                if( resource != null && new File(
getHairlessApplicationSettings().getFileResourcePath(),resource.getFileResource().getFile()
).exists() ){
                        largeImageContainer.addOrReplace( new ExternalImageUrl( 
"largeImage" ,
resource.getFileResource().getFile() ) );
                }else{
                        largeImageContainer.addOrReplace( new ExternalImageUrl( 
"largeImage" ,
"images/site/empty_small.jpg" ) );
                }
        }

        public WebPage getBackPage() {
                return backPage;
        }
        
        
        private class CartListItem implements Serializable{
                private static final long serialVersionUID = 1L;
                private SubItem subItem;
                private String attribute;
                public SubItem getSubItem() {
                        return subItem;
                }
                public void setSubItem(SubItem subItem) {
                        this.subItem = subItem;
                }
                public String getAttribute() {
                        return attribute;
                }
                public void setAttribute(String attribute) {
                        this.attribute = attribute;
                }
                
        }
}


-- 
View this message in context: 
http://www.nabble.com/Clone-a-WebPage-tp17468163p17544102.html
Sent from the Wicket - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to