/** * (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.jabylon.rest.ui.wicket.pages; import java.io.Serializable; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; import org.apache.wicket.markup.head.PriorityHeaderItem; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.jabylon.rest.ui.model.OSGiStringResourceModel; import org.jabylon.rest.ui.navbar.NavbarPanel; import org.jabylon.rest.ui.util.GlobalResources; import org.jabylon.rest.ui.wicket.FaviconHeaderItem; import org.jabylon.rest.ui.wicket.JabylonApplication; import org.jabylon.rest.ui.wicket.components.CustomFeedbackPanel; import org.jabylon.rest.ui.wicket.components.IAjaxFeedbackPage; public abstract class GenericPage<T> extends WebPage implements IAjaxFeedbackPage { private static final long serialVersionUID = 1L; private boolean constructed; private IModel<T> model; private CustomFeedbackPanel feedbackPanel; public GenericPage(PageParameters parameters) { super(parameters); } @Override public void renderHead(IHeaderResponse response) { response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(JabylonApplication.get().getJavaScriptLibrarySettings().getJQueryReference()))); response.render(new PriorityHeaderItem(JavaScriptHeaderItem.forReference(GlobalResources.JS_BOOTSTRAP))); response.render(CssHeaderItem.forReference(GlobalResources.MAIN_CSS)); response.render(new FaviconHeaderItem(GlobalResources.IMG_JABYLON_FAVICON)); super.renderHead(response); } @Override protected final void onBeforeRender() { setStatelessHint(true); internalConstruct(); onBeforeRenderPage(); super.onBeforeRender(); } protected void onBeforeRenderPage() { } private final void internalConstruct() { if (!constructed) { feedbackPanel = new CustomFeedbackPanel("feedbackPanel"); feedbackPanel.setOutputMarkupId(true); add(feedbackPanel); setModel(createModel(getPageParameters())); add(new NavbarPanel<T>("navbar", getModel(), getPageParameters())); preConstruct(); construct(); constructed = true; } } protected void preConstruct() { // subclasses may override } protected void construct() { // subclasses may override } protected abstract IModel<T> createModel(PageParameters params); public void setModel(IModel<T> model) { this.model = model; } @SuppressWarnings({ "rawtypes", "unchecked" }) protected IModel<T> createModel(T object) { return new Model((Serializable) object); } public IModel<T> getModel() { return model; } public T getModelObject() { if(model==null) return null; return model.getObject(); } @Override public void detachModels() { super.detachModels(); if(getModel()!=null) getModel().detach(); } @Override public void showFeedback(AjaxRequestTarget target) { target.add(feedbackPanel); target.appendJavaScript("$('#" + feedbackPanel.getMarkupId() + "').addClass('ajax')" + ".clearQueue().show().slideDown().delay(5000).slideUp().end().hide();"); } /** * creates a new StringResourceModel for the given key with <code>this</code> as the component * @param key * @param parameters * The parameters to substitute using a Java MessageFormat object * @return */ protected StringResourceModel nls(String key, Object... parameters) { return new StringResourceModel(key, this, null, parameters); } /** * creates a new OSGiStringResourceModel for the given key with <code>this</code> as the component. * * @param service the service implementation. Its bundle will be used to compute the localization * @param key * @param parameters * The parameters to substitute using a Java MessageFormat object * @return */ protected StringResourceModel nls(Class<?> service, String key, Object... parameters) { return new OSGiStringResourceModel(service, key, this, null, parameters); } }