Example usage for org.apache.wicket.model AbstractReadOnlyModel AbstractReadOnlyModel

List of usage examples for org.apache.wicket.model AbstractReadOnlyModel AbstractReadOnlyModel

Introduction

In this page you can find the example usage for org.apache.wicket.model AbstractReadOnlyModel AbstractReadOnlyModel.

Prototype

AbstractReadOnlyModel

Source Link

Usage

From source file:nl.knaw.dans.common.wicket.components.pagebrowse.PageBrowsePanel.java

License:Apache License

public PageBrowsePanel(final String wicketId, final IModel<PageBrowseData> model,
        PageBrowseLinkListener listener) {
    super(wicketId, model);

    if (listener != null)
        linkListeners.add(listener);//ww  w  .  j  a v  a2s. co m

    ListView<PageBrowseLink> pageBrowse = new ListView<PageBrowseLink>("pages",
            new AbstractReadOnlyModel<List<PageBrowseLink>>() {
                private static final long serialVersionUID = -7716849873494368548L;

                public List<PageBrowseLink> getObject() {
                    return computeLinks();
                }
            }) {
        private static final long serialVersionUID = 0L;

        @Override
        protected void populateItem(ListItem<PageBrowseLink> item) {
            final int page = item.getIndex();
            if (page > 0) {
                item.add(new Label("separator", DEFAULT_SEPARATOR));
            } else {
                // no separator
                item.add(new Label("separator", ""));
            }

            final PageBrowseLink plink = item.getModelObject();
            item.add(plink);
        }
    };
    add(pageBrowse);
}

From source file:nl.knaw.dans.common.wicket.components.search.browse.BrowsePanel.java

License:Apache License

private void initComponents() {
    // browse criteria
    add(new SearchCriteriaPanel("browseCriteria", getSearchModel()));

    // result count   
    add(new Label("resultCount", new AbstractReadOnlyModel<String>() {
        private static final long serialVersionUID = 1L;

        public String getObject() {
            return BrowsePanel.this.getSearchData().getResult().getTotalHits() + "";
        };/*from   ww w  . j  av  a2  s  .c om*/
    }));

    // show button
    add(new Link("showButton") {
        private static final long serialVersionUID = 1L;

        public void onClick() {
            onShowButtonClicked(getSearchModel());
        }
    });

    // browse facets
    add(new ListView<FacetConfig>("browseFacets", getConfig().getFacets()) {
        private static final long serialVersionUID = 1L;

        protected void populateItem(ListItem<FacetConfig> item) {
            FacetPanel facetPanel = new FacetPanel("browseFacet", getSearchModel(), item.getModelObject()) {
                private static final long serialVersionUID = -5913133341105521215L;

                protected void onFacetClick(nl.knaw.dans.common.lang.search.FacetValue<?> facetValue) {
                    // check for browse dead end
                    if (getSearchData().isDirty()) {
                        doSearch();
                        if (getVisibleFacetCount() == 0)
                            onBrowseDeadEnd();
                    }
                }
            };
            item.add(facetPanel);
        };
    });
}

From source file:nl.knaw.dans.common.wicket.components.search.criteria.SearchCriteriaPanel.java

License:Apache License

public SearchCriteriaPanel(String wicketId, SearchModel model) {
    super(wicketId, model);

    firstCriteriumDisabled = getCriteria().size() > 0;

    add(new ListView<SearchCriterium>("criteriumLinks", new AbstractReadOnlyModel<List<SearchCriterium>>() {
        private static final long serialVersionUID = 1L;

        public List<SearchCriterium> getObject() {
            return getCriteria();
        }//www .ja v  a 2 s.c  om
    }) {
        private static final long serialVersionUID = 4136872716659659458L;

        @Override
        protected void populateItem(final ListItem<SearchCriterium> item) {
            final SearchCriterium criterium = item.getModelObject();

            /*
            item.add(new Link<Void>("criteriumLink")
            {
               private static final long   serialVersionUID   = -2838312214613553559L;
                    
               {
              add(new CriteriumLabel("criteriumText", criterium.getLabelModel()));
               }
                       
               @Override
               public void onClick()
               {
              int idx = getCriteriaIdx(criterium);
              idx++;
              List<SearchCriterium> criteria = getCriteria();
              while(idx < criteria.size())
                 getRequestBuilder().removeCriterium(idx);
               }
                       
               public boolean isEnabled() 
               {
              if (firstCriteriumDisabled)
                 return item.getIndex()+1 < getCriteria().size();
              else
                 return true;
               };
            }
            ); */
            // Note: clicking the link removed all other criteria, it was decided not to have it 
            // but I left it as a comment above!
            item.add(new CriteriumLabel("criteriumText", criterium.getLabelModel()));

            item.add(new Link("removeLink") {
                private static final long serialVersionUID = -1063707405830738778L;

                {
                    add(new Image("closeImage",
                            new ResourceReference(SearchCriteriaPanel.class, "close-icon.png")));
                }

                public void onClick() {
                    getRequestBuilder().removeCriterium(criterium);
                };

                public boolean isVisible() {
                    return !(criterium instanceof InitialSearchCriterium);
                };
            });

            item.add(new Label("criteriumSeparator", DEFAULT_CRITERIUM_SEPARATOR)
                    .setVisible(item.getIndex() + 1 < getCriteria().size()));
        }
    });
}

From source file:nl.knaw.dans.common.wicket.components.search.facets.FacetPanel.java

License:Apache License

private void init() {
    if (!isVisible()) {
        hide("facetName");
        hide("facetValuesUL");
        hide("facetParentValue");
        return;/*from  w ww  . ja  v a  2s  .  c  o  m*/
    }

    // get the facet values from the search results
    List<FacetValue<?>> facetValues = getFacetField().getValue();

    FacetValueCollapser facetCollapser = getConfig().getFacetValueCollapser();
    FacetCriterium parentFacet = null;
    if (facetCollapser != null) {
        // collapse values
        parentFacet = FacetPanel.getPreviousSelection(getConfig(), getRequestBuilder());
        facetValues = facetCollapser.collapse(facetValues,
                parentFacet != null ? parentFacet.getFacetValue() : null);
    }

    // prune, sort and limit the facet values
    pruneEmptyValues(facetValues);
    sort(facetValues);
    facetValues = limit(facetValues);

    // parent facet
    if (parentFacet != null && getConfig().showParentFacet()) {
        add(new Label("facetParentValue", getFacetValueModel(parentFacet.getFacetValue(), true)));
    } else {
        hide("facetParentValue");
    }

    // name label
    add(new Label("facetName", getFacetNameModel(getFacetName())));

    // facet values UL
    // set column count with a css class (see FacetPanel.css)
    WebMarkupContainer facetValueUl = new WebMarkupContainer("facetValuesUL");
    add(CSSPackageResource.getHeaderContribution(new ResourceReference(FacetPanel.class, "FacetPanel.css")));
    int colCount = getConfig().getColumnCount();
    if (colCount > 1) {
        facetValueUl.add(new AttributeAppender("class", new Model("fvCol" + colCount), " "));
    }
    add(facetValueUl);

    // facet values LI
    ListView<FacetValue<?>> facetValueList = new ListView<FacetValue<?>>("facetValuesLI", facetValues) {
        private static final long serialVersionUID = -711250532805369414L;

        @Override
        protected void populateItem(ListItem<FacetValue<?>> item) {
            final FacetValue<?> facetValue = item.getModelObject();

            // facet link
            Link facetLink = new Link("facetValueLink") {
                private static final long serialVersionUID = 1356587833L;

                {
                    // value label
                    add(new Label("facetValue", getFacetValueModel(facetValue, false)));
                    // count label
                    add(new Label("facetCount", String.valueOf(facetValue.getCount())));
                }

                public void onClick() {
                    getRequestBuilder().addCriterium(
                            new FacetCriterium(getFacetName(), facetValue, new AbstractReadOnlyModel<String>() {
                                private static final long serialVersionUID = 13434324L;

                                @Override
                                public String getObject() {
                                    return CriteriumLabel.createFilterText(getFacetNameDisplay(),
                                            getFacetValueDisplay(facetValue));
                                }
                            }));

                    onFacetClick(facetValue);
                }
            };
            item.add(facetLink);
        }
    };
    facetValueUl.add(facetValueList);

}

From source file:nl.knaw.dans.common.wicket.components.search.results.SearchResultPanel.java

License:Apache License

private void initComponents() {
    // criteria//from ww w .  j  a  v  a2  s  .co m
    add(new SearchCriteriaPanel("searchCriteria", getSearchModel()) {
        private static final long serialVersionUID = -6370349646809914607L;

        public boolean isVisible() {
            return super.isVisible() && getRequestBuilder().getCriteria().size() > 1;
        };
    });

    // sort fields
    add(new SearchSortPanel("sortPanel", getSearchModel(), getConfig().getSortLinks()));

    // result message (needs to come after page browse panel)
    add(new UnescapedLabel("resultMessage", getResultMessageModel()));

    // search hits
    add(new ListView("searchHits", new AbstractReadOnlyModel<List>() {
        private static final long serialVersionUID = -8467661423061481825L;

        @Override
        public List getObject() {
            return getSearchResult().getHits();
        }
    }) {
        private static final long serialVersionUID = -6597598635055541684L;

        @Override
        protected void populateItem(ListItem item) {
            final SearchHit<?> hit = (SearchHit<?>) item.getModelObject();

            Panel hitPanel = getConfig().getHitPanelFactory().createHitPanel("searchHit", hit,
                    getSearchModel());
            if (hitPanel == null) {
                LOGGER.error(
                        "Could not create hit panel for searchHit " + hit.toString() + ". Programmer mistake.");
                throw new InternalWebError();
            }

            String oddOrEven = item.getIndex() % 2 == 0 ? "even" : "odd";
            hitPanel.add(new AttributeAppender("class", new Model(oddOrEven), " "));
            item.add(hitPanel);
        }

        @Override
        public boolean isVisible() {
            return getSearchResult().getHits().size() > 0;
        }
    });

    // search refinement panel
    add(new SearchBar("refineSearchPanel") {
        private static final long serialVersionUID = -5980195347064339476L;

        @Override
        public void onSearch(String searchText) {
            SearchResultPanel.this.getRequestBuilder().addCriterium(new TextSearchCriterium(searchText,
                    new Model<String>(CriteriumLabel.createFilterText(
                            SearchResultPanel.this.getString(SEARCHRESULTPANEL_CRITERIUMTEXT_REFINE_SEARCH),
                            searchText))));
        }

        @Override
        public boolean isVisible() {
            return SearchResultPanel.this.getSearchResult().getHits().size() > 1;
        }
    });

    add(new HelpPopup("refineHelpPopup", "Refine", getRefineHelpContent()));

    /**
     * I had to make this enclosure by hand, because putting a wicket:enclosure in a
     * wicket:enclosure caused a nasty bug when using the setResponsePage to render
     * a page with this component on it. Everytime it would say that the "browseMore"
     * component was forgotten in the markup. After almost 2 hours of searching it
     * turned out to be a freaking bug in Wicket 1.4.7. 
     */
    WebMarkupContainer refineFacets = new WebMarkupContainer("refineFacetsEnclosure") {
        private static final long serialVersionUID = 2474778991631709989L;

        public boolean isVisible() {
            for (FacetConfig facetConfig : getConfig().getRefineFacets()) {
                if (FacetPanel.isVisible(facetConfig, getSearchModel()))
                    return true;
            }
            return false;
        };
    };
    add(refineFacets);

    // refinement facets
    final FacetStrategy facetStrategy = getConfig().getFacetStrategy();
    refineFacets.add(new ListView<FacetConfig>("refineFacets", getConfig().getRefineFacets()) {
        private static final long serialVersionUID = 7406250758535500272L;

        @Override
        protected void populateItem(ListItem<FacetConfig> item) {
            FacetConfig facetConfig = item.getModelObject();
            item.add(new FacetPanel("facet", getSearchModel(), facetConfig));
            item.setVisible(facetStrategy.isFacetVisible(facetConfig, getSearchData()));
        }
    });

    // browse more
    if (getConfig().showBrowseMore()) {
        refineFacets.add(new Link("browseMore") {
            private static final long serialVersionUID = -6803231407654989149L;

            public void onClick() {
                onBrowseMoreClicked(getSearchModel());
            }
        });
    } else {
        WicketUtil.hide(refineFacets, "browseMore");
    }

    // page browse panel
    PageBrowseData pbData = new PageBrowseData(getRequestBuilder().getOffset() + 1,
            getRequestBuilder().getLimit(), getSearchResult().getTotalHits());
    pageBrowsePanel = new PageBrowsePanel(PAGEBROWSE_PANEL, new Model<PageBrowseData>(pbData) {
        private static final long serialVersionUID = 1943406023315332637L;

        @Override
        public PageBrowseData getObject() {
            PageBrowseData pbData = super.getObject();
            pbData.init(getRequestBuilder().getOffset() + 1, getRequestBuilder().getLimit(),
                    getSearchResult().getTotalHits());
            return pbData;
        }
    }, new PageBrowseLinkListener() {
        private static final long serialVersionUID = 5814085953388070471L;

        public void onClick(PageBrowseLink plink) {
            getRequestBuilder().setOffset(plink.getTargetItemStart() - 1);
        }
    });
    add(pageBrowsePanel);

    // advanced search
    if (getConfig().showAdvancedSearch()) {
        add(new Link("advancedSearch") {
            private static final long serialVersionUID = -1905413983732583324L;

            @Override
            public void onClick() {
                onAdvancedSearchClicked(getSearchModel());
            }
        });
    } else {
        hide("advancedSearch");
    }
}

From source file:nl.knaw.dans.common.wicket.components.search.results.SearchResultPanel.java

License:Apache License

public IModel<String> getResultMessageModel() {
    return new AbstractReadOnlyModel<String>() {
        private static final long serialVersionUID = -3354392109873495635L;

        @Override/* www  . j a  va  2 s .c  o m*/
        public String getObject() {
            final SearchRequest request = getSearchRequest();
            final SearchResult<?> result = getSearchResult();

            String queryString = request.getQuery().getQueryString();
            if (!StringUtils.isBlank(queryString)) {
                if (result.getTotalHits() == 1) {
                    return new StringResourceModel(RI_RESULTMESSAGE_1, SearchResultPanel.this, null,
                            new Object[] { queryString }).getObject();
                } else if (result.getTotalHits() > 1 && result.getTotalHits() <= request.getLimit()) {
                    return new StringResourceModel(RI_RESULTMESSAGE_1PAGE, SearchResultPanel.this, null,
                            new Object[] { result.getTotalHits(), queryString }).getObject();
                } else if (result.getTotalHits() > 1) {
                    return new StringResourceModel(RI_RESULTMESSAGE, SearchResultPanel.this, null,
                            new Object[] { request.getOffset() + 1,
                                    Math.min(request.getOffset() + request.getLimit(), result.getTotalHits()),
                                    result.getTotalHits(), queryString }).getObject();
                } else {
                    return new StringResourceModel(RI_NO_RESULTS, SearchResultPanel.this, null,
                            new Object[] { queryString }).getObject();
                }
            } else {
                if (result.getTotalHits() == 1) {
                    return new StringResourceModel(RI_RESULTMESSAGE_1_NIENTE, SearchResultPanel.this, null)
                            .getObject();
                } else if (result.getTotalHits() > 1
                        && pageBrowsePanel.getCurrentPage() == pageBrowsePanel.getLastPage()) {
                    return new StringResourceModel(RI_RESULTMESSAGE_1PAGE_NIENTE, SearchResultPanel.this, null,
                            new Object[] { result.getTotalHits() }).getObject();
                } else if (result.getTotalHits() > 1) {
                    return new StringResourceModel(RI_RESULTMESSAGE_NIENTE, SearchResultPanel.this, null,
                            new Object[] { request.getOffset() + 1,
                                    Math.min(request.getOffset() + request.getLimit(), result.getTotalHits()),
                                    result.getTotalHits() }).getObject();
                } else {
                    return new StringResourceModel(RI_NO_RESULTS_NIENTE, SearchResultPanel.this, null)
                            .getObject();
                }
            }
        }
    };
}

From source file:nl.knaw.dans.common.wicket.components.upload.EasyUpload.java

License:Apache License

/**
 * Creates an EasyUpload wicket component based on a panel. The default tmp directory of the machine
 * will be used for writing the uploads to disk.
 * @param id the id of the wicket component.
 *//*ww  w.j av  a  2  s  .  c om*/
public EasyUpload(String id, EasyUploadConfig config) {
    super(id);

    this.setConfig(config);

    setOutputMarkupId(true);

    // add css
    add(CSSPackageResource.getHeaderContribution(new ResourceReference(EasyUpload.class, "EasyUpload.css")));

    // add javascript libraries
    add(JavascriptPackageResource
            .getHeaderContribution(new ResourceReference(EasyUpload.class, "js/lib/json2.js")));
    add(JavascriptPackageResource
            .getHeaderContribution(new ResourceReference(EasyUpload.class, "js/lib/jquery-1.3.2.min.js")));

    // add javascript
    add(JavascriptPackageResource
            .getHeaderContribution(new ResourceReference(EasyUpload.class, "js/EasyUpload.js")));

    // add UploadPanel javascript configuration (server to client)
    IModel variablesModel = new AbstractReadOnlyModel() {
        private static final long serialVersionUID = 7602363940615595891L;

        @SuppressWarnings("unchecked")
        public Map getObject() {
            Map<String, CharSequence> variables = new HashMap<String, CharSequence>(1);
            ResourceReference uploadStatusRef = new ResourceReference(EasyUploadStatusCommand.RESOURCE_NAME);
            ResourceReference uploadCancelRef = new ResourceReference(EasyUploadCancelCommand.RESOURCE_NAME);

            variables.put("uploadStatusRequestURL", getPage().urlFor(uploadStatusRef));
            variables.put("uploadCancelRequestURL", getPage().urlFor(uploadCancelRef));
            variables.put("autoRemoveMessages", getConfig().autoRemoveMessages() ? "true" : "false");

            return variables;
        }
    };
    add(TextTemplateHeaderContributor.forJavaScript(EasyUpload.class, "js/EasyUploadConfig.js",
            variablesModel));
}

From source file:nl.knaw.dans.dccd.web.search.DccdSearchResultExplorePanel.java

License:Apache License

private void initComponents() {
    // criteria//www  . ja  v a2s.c om
    add(new SearchCriteriaPanel("searchCriteria", getSearchModel()) {
        private static final long serialVersionUID = -6370349646809914607L;

        public boolean isVisible() {
            return super.isVisible() && getRequestBuilder().getCriteria().size() > 1;
        };
    });

    // result message (needs to come after page browse panel)
    add(new UnescapedLabel("resultMessage", getResultMessageModel()));

    initGeoViewer();
    initTimeline();

    // TEST
    Form form = new Form("form") {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit() {
            //            super.onSubmit();
            logger.debug("fromYear = " + Integer.toString(getFromYear()));

            // TEST
            // try to add or change the period query and search?

            final SimpleField<YearRange> deathYear = new SimpleField<YearRange>(
                    DccdSB.TRIDAS_MEASUREMENTSERIES_INTERPRETATION_DEATHYEAR_NAME);
            deathYear.setValue(new YearRange(getFromYear(), 2014));
            final SimpleField<YearRange> lastYear = new SimpleField<YearRange>(
                    DccdSB.TRIDAS_MEASUREMENTSERIES_INTERPRETATION_LASTYEAR_NAME);
            lastYear.setValue(new YearRange(getFromYear(), 2014));

            SearchModel searchModel = getSearchModel();// TEST
            List<SearchCriterium> criteria = new ArrayList<SearchCriterium>();
            searchModel.getRequestBuilder().setCriteria(criteria); //empty!!!!!
            //            // we need to 'remove' it first, with the the name
            //            List<SearchCriterium> criteria = searchModel.getRequestBuilder().getCriteria();

            // then add it

            /*
            getSearchModel().addCriterium(new FilterCriterium(lastYear, new AbstractReadOnlyModel<String>(){
               private static final long serialVersionUID = -7747467835417089340L;
                    
               @Override
               public String getObject()
               {
                  return "Period: " + Integer.toString(getFromYear()) + " - " + "2014";
               }
            }));
             */

            /* */
            CombinedOptionalField<YearRange> endYearField = new CombinedOptionalField<YearRange>(
                    new ArrayList<String>() {
                        {
                            add(DccdSB.TRIDAS_MEASUREMENTSERIES_INTERPRETATION_DEATHYEAR_NAME);
                            add(DccdSB.TRIDAS_MEASUREMENTSERIES_INTERPRETATION_LASTYEAR_NAME);
                        }
                    });
            endYearField.setValue(new YearRange(getFromYear(), 2014));
            getSearchModel()
                    .addCriterium(new FilterCriterium(endYearField, new AbstractReadOnlyModel<String>() {
                        private static final long serialVersionUID = 3313159546708159282L;

                        @Override
                        public String getObject() {
                            return "Period: " + Integer.toString(getFromYear()) + " - " + "2014";
                        }
                    }));
            /* */

            doSearch();
        }
    };
    add(form);
    // fromYear
    TextField fromYearValue = new TextField("fromYear", new PropertyModel(this, "fromYear"), Integer.class);
    form.add(fromYearValue);
    //fromYearValue.add(new MinimumValidator(1));

}

From source file:nl.knaw.dans.dccd.web.search.DccdSearchResultExplorePanel.java

License:Apache License

public IModel<String> getResultMessageModel() {
    return new AbstractReadOnlyModel<String>() {
        private static final long serialVersionUID = -3354392109873495635L;

        @Override//from   w w  w.j a  va2  s  .  com
        public String getObject() {
            final SearchRequest request = getSearchRequest();
            final SearchResult<?> result = getSearchResult();

            String queryString = request.getQuery().getQueryString();
            if (!StringUtils.isBlank(queryString)) {
                if (result.getTotalHits() == 1) {
                    return new StringResourceModel(RI_RESULTMESSAGE_1, DccdSearchResultExplorePanel.this, null,
                            new Object[] { Strings.escapeMarkup(queryString) }).getObject();
                } else if (result.getTotalHits() > 1 && result.getTotalHits() <= request.getLimit()) {
                    return new StringResourceModel(RI_RESULTMESSAGE_1PAGE, DccdSearchResultExplorePanel.this,
                            null, new Object[] { result.getTotalHits(), Strings.escapeMarkup(queryString) })
                                    .getObject();
                } else if (result.getTotalHits() > 1) {
                    return new StringResourceModel(RI_RESULTMESSAGE, DccdSearchResultExplorePanel.this, null,
                            new Object[] { request.getOffset() + 1,
                                    Math.min(request.getOffset() + request.getLimit(), result.getTotalHits()),
                                    result.getTotalHits(), Strings.escapeMarkup(queryString) }).getObject();
                } else {
                    return new StringResourceModel(RI_NO_RESULTS, DccdSearchResultExplorePanel.this, null,
                            new Object[] { Strings.escapeMarkup(queryString) }).getObject();
                }
            } else {
                if (result.getTotalHits() == 1) {
                    return new StringResourceModel(RI_RESULTMESSAGE_1_NIENTE, DccdSearchResultExplorePanel.this,
                            null).getObject();
                } else if (result.getTotalHits() > 1) {
                    return new StringResourceModel(RI_RESULTMESSAGE_1PAGE_NIENTE,
                            DccdSearchResultExplorePanel.this, null, new Object[] { result.getTotalHits() })
                                    .getObject();
                } else {
                    return new StringResourceModel(RI_NO_RESULTS_NIENTE, DccdSearchResultExplorePanel.this,
                            null).getObject();
                }
            }
        }
    };
}

From source file:nl.knaw.dans.dccd.web.search.DccdSearchResultPanel.java

License:Apache License

private void initComponents() {
    initSearchTips();/* www  .j av a 2  s .co  m*/
    initGeoViewer();
    initTimeline();

    // TODO refactor into parts

    // Search results download is only visible for logged in users
    SearchResultsDownloadPanel searchResultsDownloadPanel = new SearchResultsDownloadPanel(
            "downloadResultsPanel", getSearchModel(), this);
    searchResultsDownloadPanel.setVisible(isAllowedToDownloadSearchResults());
    add(searchResultsDownloadPanel);

    // criteria
    add(new SearchCriteriaPanel("searchCriteria", getSearchModel()) {
        private static final long serialVersionUID = -6370349646809914607L;

        public boolean isVisible() {
            return super.isVisible() && getRequestBuilder().getCriteria().size() > 1;
        };
    });

    // sort fields
    add(new SearchSortPanel("sortPanel", getSearchModel(), getConfig().getSortLinks()));

    // result message (needs to come after page browse panel)
    add(new UnescapedLabel("resultMessage", getResultMessageModel()));

    // search hits
    add(new ListView("searchHits", new AbstractReadOnlyModel<List>() {
        private static final long serialVersionUID = -8467661423061481825L;

        @Override
        public List getObject() {
            updateMarkerIndexes(); // The hitpanels need to know the marker index

            return getSearchResult().getHits();
        }
    }) {
        private static final long serialVersionUID = -6597598635055541684L;

        @Override
        protected void populateItem(ListItem item) {
            final SearchHit<?> hit = (SearchHit<?>) item.getModelObject();

            Panel hitPanel = getConfig().getHitPanelFactory().createHitPanel("searchHit", hit,
                    getSearchModel());
            if (hitPanel == null) {
                logger.error(
                        "Could not create hit panel for searchHit " + hit.toString() + ". Programmer mistake.");
                throw new InternalWebError();
            }

            String oddOrEven = item.getIndex() % 2 == 0 ? "even" : "odd";
            hitPanel.add(new AttributeAppender("class", new Model(oddOrEven), " "));
            item.add(hitPanel);
        }

        @Override
        public boolean isVisible() {
            return getSearchResult().getHits().size() > 0;
        }
    });

    // search refinement panel
    add(new SearchBar("refineSearchPanel") {
        private static final long serialVersionUID = -5980195347064339476L;

        @Override
        public void onSearch(String searchText) {
            DccdSearchResultPanel.this.getRequestBuilder().addCriterium(new TextSearchCriterium(searchText,
                    new Model<String>(CriteriumLabel.createFilterText(
                            DccdSearchResultPanel.this.getString(SEARCHRESULTPANEL_CRITERIUMTEXT_REFINE_SEARCH),
                            searchText))));
        }

        @Override
        public boolean isVisible() {
            return DccdSearchResultPanel.this.getSearchResult().getHits().size() > 1;
        }
    });

    /**
     * I had to make this enclosure by hand, because putting a wicket:enclosure in a
     * wicket:enclosure caused a nasty bug when using the setResponsePage to render
     * a page with this component on it. Everytime it would say that the "browseMore"
     * component was forgotten in the markup. After almost 2 hours of searching it
     * turned out to be a freaking bug in Wicket 1.4.7. 
     */
    WebMarkupContainer refineFacets = new WebMarkupContainer("refineFacetsEnclosure") {
        private static final long serialVersionUID = 2474778991631709989L;

        public boolean isVisible() {
            for (FacetConfig facetConfig : getConfig().getRefineFacets()) {
                if (FacetPanel.isVisible(facetConfig, getSearchModel()))
                    return true;
            }
            return false;
        };
    };
    add(refineFacets);

    // refinement facets
    refineFacets.add(new ListView<FacetConfig>("refineFacets", getConfig().getRefineFacets()) {
        private static final long serialVersionUID = 7406250758535500272L;

        @Override
        protected void populateItem(ListItem<FacetConfig> item) {
            item.add(new FacetPanel("facet", getSearchModel(), item.getModelObject()));
        }
    });

    // browse more
    if (getConfig().showBrowseMore()) {
        refineFacets.add(new Link("browseMore") {
            private static final long serialVersionUID = -6803231407654989149L;

            public void onClick() {
                onBrowseMoreClicked(getSearchModel());
            }
        });
    } else {
        WicketUtil.hide(refineFacets, "browseMore");
    }

    // page browse panel
    PageBrowseData pbData = new PageBrowseData(getRequestBuilder().getOffset() + 1,
            getRequestBuilder().getLimit(), getSearchResult().getTotalHits());
    pageBrowsePanel = new PageBrowsePanel(PAGEBROWSE_PANEL, new Model<PageBrowseData>(pbData) {
        private static final long serialVersionUID = 1943406023315332637L;

        @Override
        public PageBrowseData getObject() {
            PageBrowseData pbData = super.getObject();
            pbData.init(getRequestBuilder().getOffset() + 1, getRequestBuilder().getLimit(),
                    getSearchResult().getTotalHits());
            return pbData;
        }
    }, new PageBrowseLinkListener() {
        private static final long serialVersionUID = 5814085953388070471L;

        public void onClick(PageBrowseLink plink) {
            getRequestBuilder().setOffset(plink.getTargetItemStart() - 1);
        }
    });
    add(pageBrowsePanel);

    // Also put a result navigation panel at the top of the result list and not only at the bottom
    PageBrowsePanel pageBrowsePanelTop = new PageBrowsePanel("pageBrowsePanelTop",
            new Model<PageBrowseData>(pbData) {
                private static final long serialVersionUID = 285669742367238762L;

                @Override
                public PageBrowseData getObject() {
                    PageBrowseData pbData = super.getObject();
                    pbData.init(getRequestBuilder().getOffset() + 1, getRequestBuilder().getLimit(),
                            getSearchResult().getTotalHits());
                    return pbData;
                }
            }, new PageBrowseLinkListener() {
                private static final long serialVersionUID = -5680633860752419691L;

                public void onClick(PageBrowseLink plink) {
                    getRequestBuilder().setOffset(plink.getTargetItemStart() - 1);
                }
            });
    add(pageBrowsePanelTop);

    // select the number of results per page, only at the top of the results
    ResultsPerPageSelectionPanel resultsPerPageSelectionPanel = new ResultsPerPageSelectionPanel(
            "resultsPerPageSelectionPanel", new Model<SearchRequestBuilder>() {
                private static final long serialVersionUID = 1L;

                // pull the request builder, because we need to set/get the 'limit'
                @Override
                public SearchRequestBuilder getObject() {
                    return getRequestBuilder();
                }
            }) {
        private static final long serialVersionUID = 1L;

        @Override
        public boolean isVisible() {
            // hide when there are no results
            return (getSearchResult().getTotalHits() > 0);
        }
    };
    add(resultsPerPageSelectionPanel);

    // advanced search
    if (getConfig().showAdvancedSearch()) {
        add(new Link("advancedSearch") {
            private static final long serialVersionUID = -1905413983732583324L;

            @Override
            public void onClick() {
                onAdvancedSearchClicked(getSearchModel());
            }
        });
    } else {
        hide("advancedSearch");
    }
}