/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program 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.exoplatform.wcm.webui.search.config;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.Node;
import javax.portlet.PortletMode;
import javax.portlet.PortletPreferences;
import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction;
import org.exoplatform.ecm.webui.selector.UISelectable;
import org.exoplatform.services.cms.views.ApplicationTemplateManagerService;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.wcm.webui.search.UIWCMSearchPortlet;
import org.exoplatform.wcm.webui.selector.page.UIPageSelector;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormSelectBox;
import org.exoplatform.webui.form.UIFormStringInput;
/*
* Created by The eXo Platform SAS Author : Anh Do Ngoc anh.do@exoplatform.com
* Oct 31, 2008
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/groovy/webui/search/config/UISearchPageLayoutManager.gtmpl",
events = {
@EventConfig(listeners = UISearchPageLayoutManager.SaveActionListener.class),
@EventConfig(listeners = UISearchPageLayoutManager.SelectBasePathActionListener.class),
@EventConfig(listeners = UISearchPageLayoutManager.CancelActionListener.class)
}
)
public class UISearchPageLayoutManager extends UIForm implements UISelectable {
/** The Constant PORTLET_NAME. */
public static final String PORTLET_NAME = "search";
/** The Constant SEARCH_PAGE_LAYOUT_CATEGORY. */
public static final String SEARCH_PAGE_LAYOUT_CATEGORY = "search-page-layout";
/** The Constant SEARCH_PAGE_LAYOUT_SELECTOR. */
public static final String SEARCH_PAGE_LAYOUT_SELECTOR = "searchPageLayoutSelector";
/** The Constant SEARCH_FORM_TEMPLATE_CATEGORY. */
public static final String SEARCH_FORM_TEMPLATE_CATEGORY = "search-form";
// /** The Constant SEARCH_PAGINATOR_TEMPLATE_CATEGORY. */
// public static final String SEARCH_PAGINATOR_TEMPLATE_CATEGORY = "search-paginator";
/** The Constant SEARCH_RESULT_TEMPLATE_CATEGORY. */
public static final String SEARCH_RESULT_TEMPLATE_CATEGORY = "search-result";
/** The Constant SEARCH_FORM_TEMPLATE_SELECTOR. */
public static final String SEARCH_FORM_TEMPLATE_SELECTOR = "searchFormSelector";
/** The Constant SEARCH_PAGINATOR_TEMPLATE_SELECTOR. */
public static final String SEARCH_PAGINATOR_TEMPLATE_SELECTOR = "searchPaginatorSelector";
/** The Constant SEARCH_RESULT_TEMPLATE_SELECTOR. */
public static final String SEARCH_RESULT_TEMPLATE_SELECTOR = "searchResultSelector";
/** The Constant ITEMS_PER_PAGE_SELECTOR. */
public final static String ITEMS_PER_PAGE_SELECTOR = "itemsPerPageSelector";
/** The Constant PAGE_MODE_SELECTOR. */
public final static String PAGE_MODE_SELECTOR = "pageMode";
/** The Constant BASE_PATH_INPUT. */
public final static String BASE_PATH_INPUT = "searchResultBasePathInput";
/** The Constant BASE_PATH_SELECTOR_POPUP_WINDOW. */
public final static String BASE_PATH_SELECTOR_POPUP_WINDOW = "searchResultBasePathPopupWindow";
/** The Constant BASE_PATH_INPUT_SET_ACTION. */
public final static String BASE_PATH_INPUT_SET_ACTION = "searchResultBasePathInputSetAction";
/** The popup id. */
private String popupId;
/**
* @return the popupId
*/
public String getPopupId() {
return popupId;
}
/**
* @param popupId the popupId to set
*/
public void setPopupId(String popupId) {
this.popupId = popupId;
}
/**
* Instantiates a new uI search page layout manager.
*
* @throws Exception the exception
*/
public UISearchPageLayoutManager() throws Exception {
PortletRequestContext portletRequestContext = WebuiRequestContext.getCurrentInstance();
PortletPreferences portletPreferences = portletRequestContext.getRequest().getPreferences();
String itemsPerpage = portletPreferences.getValue(UIWCMSearchPortlet.ITEMS_PER_PAGE, null);
String pageMode = portletPreferences.getValue(UIWCMSearchPortlet.PAGE_MODE, null);
String searchFormTemplate = portletPreferences.getValue(UIWCMSearchPortlet.SEARCH_FORM_TEMPLATE_PATH,
null);
String searchResultTemplate = portletPreferences.getValue(UIWCMSearchPortlet.SEARCH_RESULT_TEMPLATE_PATH,
null);
// String searchPaginatorTemplate = portletPreferences.getValue(UIWCMSearchPortlet.SEARCH_PAGINATOR_TEMPLATE_PATH,
// null);
String searchPageLayoutTemplate = portletPreferences.getValue(UIWCMSearchPortlet.SEARCH_PAGE_LAYOUT_TEMPLATE_PATH,
null);
List<SelectItemOption<String>> searchFormTemplateList = createTemplateList(PORTLET_NAME,
SEARCH_FORM_TEMPLATE_CATEGORY);
List<SelectItemOption<String>> searchResultTemplateList = createTemplateList(PORTLET_NAME,
SEARCH_RESULT_TEMPLATE_CATEGORY);
// List<SelectItemOption<String>> searchPaginatorTemplateList = createTemplateList(PORTLET_NAME,
// SEARCH_PAGINATOR_TEMPLATE_CATEGORY);
List<SelectItemOption<String>> searchPageLayoutTemplateList = createTemplateList(PORTLET_NAME,
SEARCH_PAGE_LAYOUT_CATEGORY);
List<SelectItemOption<String>> itemsPerPageList = new ArrayList<SelectItemOption<String>>();
itemsPerPageList.add(new SelectItemOption<String>("5", "5"));
itemsPerPageList.add(new SelectItemOption<String>("10", "10"));
itemsPerPageList.add(new SelectItemOption<String>("20", "20"));
List<SelectItemOption<String>> pageModeList = new ArrayList<SelectItemOption<String>>();
pageModeList.add(new SelectItemOption<String>("none", "none"));
pageModeList.add(new SelectItemOption<String>("more", "more"));
pageModeList.add(new SelectItemOption<String>("pagination", "pagination"));
UIFormSelectBox pageModeSelector = new UIFormSelectBox(PAGE_MODE_SELECTOR,
PAGE_MODE_SELECTOR,
pageModeList);
UIFormSelectBox itemsPerPageSelector = new UIFormSelectBox(ITEMS_PER_PAGE_SELECTOR,
ITEMS_PER_PAGE_SELECTOR,
itemsPerPageList);
UIFormSelectBox searchFormTemplateSelector = new UIFormSelectBox(SEARCH_FORM_TEMPLATE_SELECTOR,
SEARCH_FORM_TEMPLATE_SELECTOR,
searchFormTemplateList);
UIFormSelectBox searchResultTemplateSelector = new UIFormSelectBox(SEARCH_RESULT_TEMPLATE_SELECTOR,
SEARCH_RESULT_TEMPLATE_SELECTOR,
searchResultTemplateList);
// UIFormSelectBox searchPaginatorTemplateSelector = new UIFormSelectBox(SEARCH_PAGINATOR_TEMPLATE_SELECTOR,
// SEARCH_PAGINATOR_TEMPLATE_SELECTOR,
// searchPaginatorTemplateList);
UIFormSelectBox searchPageLayoutTemplateSelector = new UIFormSelectBox(SEARCH_PAGE_LAYOUT_SELECTOR,
SEARCH_PAGE_LAYOUT_SELECTOR,
searchPageLayoutTemplateList);
String preferenceBasePath = portletPreferences.getValue(UIWCMSearchPortlet.BASE_PATH, null);
UIFormInputSetWithAction targetPathFormInputSet = new UIFormInputSetWithAction(BASE_PATH_INPUT_SET_ACTION);
UIFormStringInput targetPathFormStringInput = new UIFormStringInput(BASE_PATH_INPUT, BASE_PATH_INPUT, preferenceBasePath);
targetPathFormStringInput.setValue(preferenceBasePath);
targetPathFormStringInput.setReadOnly(true);
targetPathFormInputSet.setActionInfo(BASE_PATH_INPUT, new String[] {"SelectBasePath"}) ;
targetPathFormInputSet.addUIFormInput(targetPathFormStringInput);
pageModeSelector.setValue(pageMode);
itemsPerPageSelector.setValue(itemsPerpage);
searchFormTemplateSelector.setValue(searchFormTemplate);
searchResultTemplateSelector.setValue(searchResultTemplate);
// searchPaginatorTemplateSelector.setValue(searchPaginatorTemplate);
searchPageLayoutTemplateSelector.setValue(searchPageLayoutTemplate);
addChild(pageModeSelector);
addChild(itemsPerPageSelector);
addChild(searchFormTemplateSelector);
addChild(searchResultTemplateSelector);
// addChild(searchPaginatorTemplateSelector);
addChild(searchPageLayoutTemplateSelector);
addChild(targetPathFormInputSet);
setActions(new String[] { "Save", "Cancel" });
}
/**
* Creates the template list.
*
* @param portletName the portlet name
* @param category the category
*
* @return the list< select item option< string>>
*
* @throws Exception the exception
*/
private List<SelectItemOption<String>> createTemplateList(String portletName, String category) throws Exception {
List<SelectItemOption<String>> templateList = new ArrayList<SelectItemOption<String>>();
ApplicationTemplateManagerService templateManagerService = getApplicationComponent(ApplicationTemplateManagerService.class);
List<Node> templateNodeList = templateManagerService.getTemplatesByCategory(portletName,
category,
WCMCoreUtils.getUserSessionProvider());
for (Node templateNode : templateNodeList) {
String templateName = templateNode.getName();
String templatePath = templateNode.getPath();
templateList.add(new SelectItemOption<String>(templateName, templatePath));
}
return templateList;
}
/**
* The listener interface for receiving saveAction events. The class that is
* interested in processing a saveAction event implements this interface, and
* the object created with that class is registered with a component using the
* component's <code>addSaveActionListener</code> method. When
* the saveAction event occurs, that object's appropriate
* method is invoked.
*
*/
public static class SaveActionListener extends EventListener<UISearchPageLayoutManager> {
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui
* .event.Event)
*/
public void execute(Event<UISearchPageLayoutManager> event) throws Exception {
UISearchPageLayoutManager uiSearchLayoutManager = event.getSource();
UIApplication uiApp = uiSearchLayoutManager.getAncestorOfType(UIApplication.class);
RepositoryService repositoryService = uiSearchLayoutManager.getApplicationComponent(RepositoryService.class);
ManageableRepository manageableRepository = repositoryService.getCurrentRepository();
String repository = manageableRepository.getConfiguration().getName();
String workspace = manageableRepository.getConfiguration().getDefaultWorkspaceName();
PortletRequestContext portletRequestContext = (PortletRequestContext) event.getRequestContext();
PortletPreferences portletPreferences = portletRequestContext.getRequest().getPreferences();
String searchResultTemplatePath = uiSearchLayoutManager.
getUIFormSelectBox(UISearchPageLayoutManager.SEARCH_RESULT_TEMPLATE_SELECTOR).getValue();
String searchFormTemplatePath = uiSearchLayoutManager.
getUIFormSelectBox(UISearchPageLayoutManager.SEARCH_FORM_TEMPLATE_SELECTOR).getValue();
// String searchPaginatorTemplatePath = uiSearchLayoutManager.
// getUIFormSelectBox(UISearchPageLayoutManager.SEARCH_PAGINATOR_TEMPLATE_SELECTOR).getValue();
String searchPageLayoutTemplatePath = uiSearchLayoutManager.
getUIFormSelectBox(UISearchPageLayoutManager.SEARCH_PAGE_LAYOUT_SELECTOR).getValue();
String itemsPerPage = uiSearchLayoutManager.
getUIFormSelectBox(UISearchPageLayoutManager.ITEMS_PER_PAGE_SELECTOR).getValue();
String pageMode = uiSearchLayoutManager.getUIFormSelectBox(UISearchPageLayoutManager.PAGE_MODE_SELECTOR).getValue();
String basePath = uiSearchLayoutManager.getUIStringInput(UISearchPageLayoutManager.BASE_PATH_INPUT)
.getValue();
portletPreferences.setValue(UIWCMSearchPortlet.REPOSITORY, repository);
portletPreferences.setValue(UIWCMSearchPortlet.WORKSPACE, workspace);
portletPreferences.setValue(UIWCMSearchPortlet.SEARCH_RESULT_TEMPLATE_PATH,
searchResultTemplatePath);
portletPreferences.setValue(UIWCMSearchPortlet.SEARCH_FORM_TEMPLATE_PATH,
searchFormTemplatePath);
// portletPreferences.setValue(UIWCMSearchPortlet.SEARCH_PAGINATOR_TEMPLATE_PATH,
// searchPaginatorTemplatePath);
portletPreferences.setValue(UIWCMSearchPortlet.SEARCH_PAGE_LAYOUT_TEMPLATE_PATH,
searchPageLayoutTemplatePath);
portletPreferences.setValue(UIWCMSearchPortlet.ITEMS_PER_PAGE, itemsPerPage);
portletPreferences.setValue(UIWCMSearchPortlet.PAGE_MODE, pageMode);
portletPreferences.setValue(UIWCMSearchPortlet.BASE_PATH, basePath);
portletPreferences.store();
if (Utils.isEditPortletInCreatePageWizard()) {
uiApp.addMessage(new ApplicationMessage("UISearchConfig.msg.saving-success",
null,
ApplicationMessage.INFO));
} else {
portletRequestContext.setApplicationMode(PortletMode.VIEW);
}
}
}
/**
* The listener interface for receiving cancelAction events. The class that is
* interested in processing a cancelAction event implements this interface,
* and the object created with that class is registered with a component using
* the component's <code>addCancelActionListener</code> method. When
* the cancelAction event occurs, that object's appropriate
* method is invoked.
*
*/
public static class CancelActionListener extends EventListener<UISearchPageLayoutManager> {
/*
* (non-Javadoc)
* @see
* org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui
* .event.Event)
*/
public void execute(Event<UISearchPageLayoutManager> event) throws Exception {
PortletRequestContext context = (PortletRequestContext) event.getRequestContext();
context.setApplicationMode(PortletMode.VIEW);
}
}
/*
* (non-Javadoc)
*
* @see org.exoplatform.ecm.webui.selector.UISelectable#doSelect(java.lang.String,
* java.lang.Object)
*/
public void doSelect(String selectField, Object value) throws Exception {
getUIStringInput(selectField).setValue((String) value);
Utils.closePopupWindow(this, popupId);
}
/**
* The listener interface for receiving selectTargetPageAction events.
* The class that is interested in processing a selectTargetPageAction
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addSelectTargetPageActionListener</code> method. When
* the selectTargetPageAction event occurs, that object's appropriate
* method is invoked.
*
*/
public static class SelectBasePathActionListener extends EventListener<UISearchPageLayoutManager> {
/* (non-Javadoc)
* @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
*/
public void execute(Event<UISearchPageLayoutManager> event) throws Exception {
UISearchPageLayoutManager viewerManagementForm = event.getSource();
UIPageSelector pageSelector = viewerManagementForm.createUIComponent(UIPageSelector.class, null, null);
pageSelector.setSourceComponent(viewerManagementForm, new String[] {BASE_PATH_INPUT});
Utils.createPopupWindow(viewerManagementForm, pageSelector, BASE_PATH_SELECTOR_POPUP_WINDOW, 800);
viewerManagementForm.setPopupId(BASE_PATH_SELECTOR_POPUP_WINDOW);
}
}
}