/////////////////////////////////////////////////////////////////////////////
//
// 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.core;
import java.util.Collection;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.projectforge.access.AccessChecker;
import org.projectforge.user.PFUserContext;
import org.projectforge.user.UserXmlPreferencesCache;
import org.projectforge.web.FavoritesMenu;
import org.projectforge.web.LoginPage;
import org.projectforge.web.MenuEntry;
import org.projectforge.web.core.menuconfig.MenuConfig;
import org.projectforge.web.dialog.ModalDialog;
import org.projectforge.web.doc.DocumentationPage;
import org.projectforge.web.mobile.MenuMobilePage;
import org.projectforge.web.user.ChangePasswordPage;
import org.projectforge.web.user.MyAccountEditPage;
import org.projectforge.web.wicket.AbstractSecuredPage;
import org.projectforge.web.wicket.CsrfTokenHandler;
import org.projectforge.web.wicket.FeedbackPage;
import org.projectforge.web.wicket.MySession;
import org.projectforge.web.wicket.WicketUtils;
import org.projectforge.web.wicket.flowlayout.FieldsetPanel;
/**
* Displays the favorite menu.
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
public class NavTopPanel extends NavAbstractPanel
{
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(NavTopPanel.class);
private static final long serialVersionUID = -7858806882044188339L;
private FavoritesMenu favoritesMenu;
private final AccessChecker accessChecker;
private final UserXmlPreferencesCache userXmlPreferencesCache;
private BookmarkDialog bookmarkDialog;
/**
* Cross site request forgery token.
*/
private CsrfTokenHandler csrfTokenHandler;
public NavTopPanel(final String id, final UserXmlPreferencesCache userXmlPreferencesCache, final AccessChecker accessChecker)
{
super(id);
this.userXmlPreferencesCache = userXmlPreferencesCache;
this.accessChecker = accessChecker;
}
public void init(final AbstractSecuredPage page)
{
getMenu();
this.favoritesMenu = FavoritesMenu.get();
final WebMarkupContainer goMobile = new WebMarkupContainer("goMobile");
add(goMobile);
if (page.getMySession().isMobileUserAgent() == true) {
goMobile.add(new BookmarkablePageLink<Void>("link", MenuMobilePage.class));
} else {
goMobile.setVisible(false);
}
add(new MenuConfig("menuconfig", getMenu(), favoritesMenu));
@SuppressWarnings("serial")
final Form<String> searchForm = new Form<String>("searchForm") {
private String searchString;
/**
* @see org.apache.wicket.markup.html.form.Form#onSubmit()
*/
@Override
protected void onSubmit()
{
csrfTokenHandler.onSubmit();
if (StringUtils.isNotBlank(searchString) == true) {
final SearchPage searchPage = new SearchPage(new PageParameters(), searchString);
setResponsePage(searchPage);
}
super.onSubmit();
}
};
csrfTokenHandler = new CsrfTokenHandler(searchForm);
add(searchForm);
final TextField<String> searchField = new TextField<String>("searchField", new PropertyModel<String>(searchForm, "searchString"));
WicketUtils.setPlaceHolderAttribute(searchField, getString("search.search"));
searchForm.add(searchField);
add(new BookmarkablePageLink<Void>("feedbackLink", FeedbackPage.class));
{
@SuppressWarnings("serial")
final AjaxLink<Void> showBookmarkLink = new AjaxLink<Void>("showBookmarkLink") {
/**
* @see org.apache.wicket.ajax.markup.html.AjaxLink#onClick(org.apache.wicket.ajax.AjaxRequestTarget)
*/
@Override
public void onClick(final AjaxRequestTarget target)
{
bookmarkDialog.open(target);
// Redraw the content:
bookmarkDialog.redraw().addContent(target);
}
};
add(showBookmarkLink);
addBookmarkDialog();
}
{
add(new Label("user", PFUserContext.getUser().getFullname()));
if (accessChecker.isRestrictedUser() == true) {
// Show ChangePaswordPage as my account for restricted users.
final BookmarkablePageLink<Void> changePasswordLink = new BookmarkablePageLink<Void>("myAccountLink", ChangePasswordPage.class);
add(changePasswordLink);
} else {
final BookmarkablePageLink<Void> myAccountLink = new BookmarkablePageLink<Void>("myAccountLink", MyAccountEditPage.class);
add(myAccountLink);
}
final BookmarkablePageLink<Void> documentationLink = new BookmarkablePageLink<Void>("documentationLink", DocumentationPage.class);
add(documentationLink);
@SuppressWarnings("serial")
final Link<String> logoutLink = new Link<String>("logoutLink") {
@Override
public void onClick()
{
LoginPage.logout((MySession) getSession(), (WebRequest) getRequest(), (WebResponse) getResponse(), userXmlPreferencesCache);
setResponsePage(LoginPage.class);
};
};
add(logoutLink);
}
addCompleteMenu();
addFavoriteMenu();
}
@SuppressWarnings("serial")
private void addCompleteMenu()
{
final Label totalMenuSuffixLabel = new MenuSuffixLabel("totalMenuCounter", new Model<Integer>() {
@Override
public Integer getObject()
{
int counter = 0;
if (menu.getMenuEntries() == null) {
return counter;
}
for (final MenuEntry menuEntry : menu.getMenuEntries()) {
final IModel<Integer> newCounterModel = menuEntry.getNewCounterModel();
if (newCounterModel != null && newCounterModel.getObject() != null) {
counter += newCounterModel.getObject();
}
}
return counter;
};
});
add(totalMenuSuffixLabel);
final RepeatingView completeMenuCategoryRepeater = new RepeatingView("completeMenuCategoryRepeater");
add(completeMenuCategoryRepeater);
if (menu.getMenuEntries() != null) {
for (final MenuEntry menuEntry : menu.getMenuEntries()) {
if (menuEntry.getSubMenuEntries() == null) {
continue;
}
// Now we add a new menu area (title with sub menus):
final WebMarkupContainer categoryContainer = new WebMarkupContainer(completeMenuCategoryRepeater.newChildId());
completeMenuCategoryRepeater.add(categoryContainer);
categoryContainer.add(new Label("menuCategoryLabel", getString(menuEntry.getI18nKey())));
final Label areaSuffixLabel = getSuffixLabel(menuEntry);
categoryContainer.add(areaSuffixLabel);
// final WebMarkupContainer subMenuContainer = new WebMarkupContainer("subMenu");
// categoryContainer.add(subMenuContainer);
if (menuEntry.hasSubMenuEntries() == false) {
// subMenuContainer.setVisible(false);
continue;
}
final RepeatingView completeSubMenuRepeater = new RepeatingView("completeSubMenuRepeater");
categoryContainer.add(completeSubMenuRepeater);
for (final MenuEntry subMenuEntry : menuEntry.getSubMenuEntries()) {
if (subMenuEntry.getSubMenuEntries() != null) {
log.error("Oups: sub sub menus not supported: " + menuEntry.getId() + " has child menus which are ignored.");
}
// Now we add the next menu entry to the area:
final WebMarkupContainer subMenuItem = new WebMarkupContainer(completeSubMenuRepeater.newChildId());
completeSubMenuRepeater.add(subMenuItem);
final AbstractLink link = getMenuEntryLink(subMenuEntry, true);
if (link != null) {
subMenuItem.add(link);
} else {
subMenuItem.setVisible(false);
}
}
}
}
}
private void addFavoriteMenu()
{
// Favorite menu:
final RepeatingView menuRepeater = new RepeatingView("menuRepeater");
add(menuRepeater);
final Collection<MenuEntry> menuEntries = favoritesMenu.getMenuEntries();
if (menuEntries != null) {
for (final MenuEntry menuEntry : menuEntries) {
// Now we add a new menu area (title with sub menus):
final WebMarkupContainer menuItem = new WebMarkupContainer(menuRepeater.newChildId());
menuRepeater.add(menuItem);
final AbstractLink link = getMenuEntryLink(menuEntry, true);
if (link == null) {
menuItem.setVisible(false);
continue;
}
menuItem.add(link);
final WebMarkupContainer subMenuContainer = new WebMarkupContainer("subMenu");
menuItem.add(subMenuContainer);
final WebMarkupContainer caret = new WebMarkupContainer("caret");
link.add(caret);
if (menuEntry.hasSubMenuEntries() == false) {
subMenuContainer.setVisible(false);
caret.setVisible(false);
continue;
}
menuItem.add(AttributeModifier.append("class", "dropdown"));
link.add(AttributeModifier.append("class", "dropdown-toggle"));
link.add(AttributeModifier.append("data-toggle", "dropdown"));
final RepeatingView subMenuRepeater = new RepeatingView("subMenuRepeater");
subMenuContainer.add(subMenuRepeater);
for (final MenuEntry subMenuEntry : menuEntry.getSubMenuEntries()) {
// Now we add the next menu entry to the area:
if (subMenuEntry.hasSubMenuEntries() == false) {
final WebMarkupContainer subMenuItem = new WebMarkupContainer(subMenuRepeater.newChildId());
subMenuRepeater.add(subMenuItem);
// Subsubmenu entries aren't yet supported, show only the sub entries without children, otherwise only the children are
// displayed.
final AbstractLink subLink = getMenuEntryLink(subMenuEntry, true);
if (subLink == null) {
subMenuItem.setVisible(false);
continue;
}
subMenuItem.add(subLink);
continue;
}
// final WebMarkupContainer subsubMenuContainer = new WebMarkupContainer("subsubMenu");
// subMenuItem.add(subsubMenuContainer);
// if (subMenuEntry.hasSubMenuEntries() == false) {
// subsubMenuContainer.setVisible(false);
// continue;
// }
// final RepeatingView subsubMenuRepeater = new RepeatingView("subsubMenuRepeater");
// subsubMenuContainer.add(subsubMenuRepeater);
for (final MenuEntry subsubMenuEntry : subMenuEntry.getSubMenuEntries()) {
// Now we add the next menu entry to the sub menu:
final WebMarkupContainer subMenuItem = new WebMarkupContainer(subMenuRepeater.newChildId());
subMenuRepeater.add(subMenuItem);
// Subsubmenu entries aren't yet supported, show only the sub entries without children, otherwise only the children are
// displayed.
final AbstractLink subLink = getMenuEntryLink(subsubMenuEntry, true);
if (subLink == null) {
subMenuItem.setVisible(false);
continue;
}
subMenuItem.add(subLink);
// final WebMarkupContainer subsubMenuItem = new WebMarkupContainer(subsubMenuRepeater.newChildId());
// subsubMenuRepeater.add(subsubMenuItem);
// final AbstractLink subsubLink = getMenuEntryLink(subsubMenuEntry, subsubMenuItem);
// subsubMenuItem.add(subsubLink);
}
}
}
}
}
private void addBookmarkDialog()
{
final AbstractSecuredPage parentPage = (AbstractSecuredPage) getPage();
bookmarkDialog = new BookmarkDialog(parentPage.newModalDialogId());
bookmarkDialog.setOutputMarkupId(true);
parentPage.add(bookmarkDialog);
bookmarkDialog.init();
}
@SuppressWarnings("serial")
private class BookmarkDialog extends ModalDialog
{
/**
* @param id
*/
public BookmarkDialog(final String id)
{
super(id);
}
@Override
public void init()
{
setTitle(getString("bookmark.title"));
init(new Form<String>(getFormId()));
gridBuilder.newFormHeading(""); // Otherwise it's empty and an IllegalArgumentException is thrown.
}
private BookmarkDialog redraw()
{
clearContent();
final AbstractSecuredPage page = (AbstractSecuredPage) NavTopPanel.this.getPage();
{
final FieldsetPanel fs = gridBuilder.newFieldset(getString("bookmark.directPageLink")).setLabelSide(false);
final TextArea<String> textArea = new TextArea<String>(fs.getTextAreaId(), new Model<String>(page.getPageAsLink()));
fs.add(textArea);
textArea.add(AttributeModifier.replace("onClick", "$(this).select();"));
}
final PageParameters params = page.getBookmarkableInitialParameters();
if (params.isEmpty() == false) {
final FieldsetPanel fs = gridBuilder.newFieldset(getString(page.getTitleKey4BookmarkableInitialParameters())).setLabelSide(false);
final TextArea<String> textArea = new TextArea<String>(fs.getTextAreaId(), new Model<String>(page.getPageAsLink(params)));
fs.add(textArea);
textArea.add(AttributeModifier.replace("onClick", "$(this).select();"));
}
return this;
}
}
}