/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.web.mobile;
import java.text.MessageFormat;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.wicket.Application;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.head.CssReferenceHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
import org.apache.wicket.markup.head.StringHeaderItem;
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.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.projectforge.AppVersion;
import org.projectforge.user.PFUserDO;
import org.projectforge.web.WebConfiguration;
import org.projectforge.web.wicket.AbstractSecuredPage;
import org.projectforge.web.wicket.MySession;
import org.projectforge.web.wicket.WicketApplicationInterface;
import org.projectforge.web.wicket.WicketUtils;
/**
* Do only derive from this page, if no login is required!
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
public abstract class AbstractMobilePage extends WebPage
{
public static final String JQUERY_MOBILE_VERSION = "1.4.2";
private static final long serialVersionUID = -6221091194614601467L;
protected final static String TOP_RIGHT_BUTTON_ID = "topRightButton";
protected final static String TOP_LEFT_BUTTON_ID = "topLeftButton";
protected final static String TOP_CENTER_ID = "topCenter";
protected boolean alreadySubmitted = false;
protected WebMarkupContainer headerContainer;
protected WebMarkupContainer rightButtonContainer;
protected WebMarkupContainer pageContainer;
private boolean topButtonsRendered;
public AbstractMobilePage()
{
this(new PageParameters());
}
protected void setNoBackButton()
{
headerContainer.add(AttributeModifier.replace("data-nobackbtn", "true"));
}
/**
* Constructor that is invoked when page is invoked without a session.
*
* @param parameters Page parameters
*/
@SuppressWarnings("serial")
public AbstractMobilePage(final PageParameters parameters)
{
super(parameters);
add(pageContainer = new WebMarkupContainer("page"));
pageContainer.add(headerContainer = new WebMarkupContainer("header"));
add(new Label("windowTitle", new Model<String>() {
@Override
public String getObject()
{
return getWindowTitle();
}
}));
final Model<String> loggedInLabelModel = new Model<String>() {
@Override
public String getObject()
{
return "<strong>" + escapeHtml(AppVersion.APP_TITLE) + "</strong>";
}
};
pageContainer.add(new Label("loggedInLabel", loggedInLabelModel).setEscapeModelStrings(false).setRenderBodyOnly(false)
.setVisible(getUser() != null));
if (getWicketApplication().isDevelopmentSystem() == true) {
// navigationContainer.add(AttributeModifier.replace("style", WebConstants.CSS_BACKGROUND_COLOR_RED));
} else {
}
pageContainer.add(AttributeModifier.append("data-title", new Model<String>() {
@Override
public String getObject()
{
return getTitle();
}
}));
}
@Override
public void renderHead(final IHeaderResponse response)
{
super.renderHead(response);
response.render(JavaScriptReferenceHeaderItem.forReference(Application.get().getJavaScriptLibrarySettings().getJQueryReference()));
response.render(StringHeaderItem.forString(WicketUtils.getCssForFavicon(getUrl("/favicon.ico"))));
if (WebConfiguration.isDevelopmentMode() == true) {
response.render(CssReferenceHeaderItem.forUrl("mobile/jquery.mobile-" + JQUERY_MOBILE_VERSION + "/jquery.mobile-" + JQUERY_MOBILE_VERSION + ".css"));
} else {
response.render(CssReferenceHeaderItem.forUrl("mobile/jquery.mobile-" + JQUERY_MOBILE_VERSION + "/jquery.mobile-" + JQUERY_MOBILE_VERSION + ".min.css"));
}
response.render(CssReferenceHeaderItem.forUrl("mobile/projectforge.css"));
response.render(JavaScriptReferenceHeaderItem.forUrl("mobile/jquery.mobile-" + JQUERY_MOBILE_VERSION + "/myconfig.js"));
if (WebConfiguration.isDevelopmentMode() == true) {
// response.renderJavaScriptReference("mobile/jquery.mobile/myconfig.js");
response.render(JavaScriptReferenceHeaderItem.forUrl("mobile/jquery.mobile-" + JQUERY_MOBILE_VERSION + "/jquery.mobile-" + JQUERY_MOBILE_VERSION + ".js"));
} else {
// response.renderJavaScriptReference("mobile/jquery.mobile/myconfig.js");
response.render(JavaScriptReferenceHeaderItem.forUrl("mobile/jquery.mobile-" + JQUERY_MOBILE_VERSION + "/jquery.mobile-" + JQUERY_MOBILE_VERSION + ".min.js"));
}
}
@Override
protected void onBeforeRender()
{
super.onBeforeRender();
if (topButtonsRendered == false) {
topButtonsRendered = true;
addTopLeftButton();
addTopCenter();
addTopRightButton();
}
alreadySubmitted = false;
}
public MySession getMySession()
{
return (MySession) getSession();
}
protected WicketApplicationInterface getWicketApplication()
{
return (WicketApplicationInterface) getApplication();
}
protected abstract String getTitle();
/**
* Security. Implement this method if you are really sure that you want to implement an unsecure page (meaning this page is available
* without any authorization, it's therefore public)!
*/
protected abstract void thisIsAnUnsecuredPage();
/**
* @see StringEscapeUtils#escapeHtml(String)
*/
protected String escapeHtml(final String str)
{
return StringEscapeUtils.escapeHtml(str);
}
/**
* Always returns null for unsecured page.
* @return null
* @see AbstractSecuredPage#getUser()
*/
protected PFUserDO getUser()
{
return null;
}
protected String getLocalizedMessage(final String key, final Object... params)
{
if (params == null) {
return getString(key);
}
return MessageFormat.format(getString(key), params);
}
/**
* Includes session id (encode URL) at default.
* @see #getUrl(String, boolean)
*/
public String getUrl(final String path)
{
return getUrl(path, true);
}
/**
* @see WicketUtils#getImageUrl(org.apache.wicket.Response, String)
*/
public String getImageUrl(final String subpath)
{
return WicketUtils.getImageUrl(getRequestCycle(), subpath);
}
/**
* @see WicketUtils#getUrl(org.apache.wicket.Response, String, boolean)
*/
public String getUrl(final String path, final boolean encodeUrl)
{
return WicketUtils.getUrl(getRequestCycle(), path, encodeUrl);
}
protected String getWindowTitle()
{
return AppVersion.APP_ID;
}
/**
* Adds about link as default.
*/
protected void addTopRightButton()
{
headerContainer.add(new JQueryButtonPanel(TOP_RIGHT_BUTTON_ID, JQueryButtonType.INFO, AboutMobilePage.class, null,
getString("mobile.about")).setNoText().setAlignment(Alignment.LEFT).setRelDialog());
}
/**
* @return Title of this page as default.
*/
protected void addTopCenter()
{
// headerContainer.add(new Label(AbstractMobilePage.TOP_CENTER_ID, AppVersion.APP_TITLE));
headerContainer.add(new Label(AbstractMobilePage.TOP_CENTER_ID, getTitle()));
}
/**
* Adds home link as default.
*/
protected void addTopLeftButton()
{
headerContainer.add(MenuMobilePage.getHomeLink(this, TOP_LEFT_BUTTON_ID));
}
}