/*
* Copyright (C) 2003-2007 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.ecm.webui.component.explorer.control;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.exoplatform.ecm.jcr.model.Preference;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorerPortlet;
import org.exoplatform.ecm.webui.component.explorer.sidebar.UIAllItems;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.wcm.core.NodetypeConstant;
import org.exoplatform.web.application.RequestContext;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupContainer;
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.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormSelectBox;
import org.exoplatform.webui.form.input.UICheckBoxInput;
/**
* Created by The eXo Platform SARL
* Author : Chien Nguyen
* chien.nguyen@exoplatform.org
* July 28, 2010
* 14:07:15 PM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/groovy/webui/component/explorer/UIPreferencesForm.gtmpl",
events = {
@EventConfig(listeners = UIPreferencesForm.SaveActionListener.class),
@EventConfig(phase = Phase.DECODE, listeners = UIPreferencesForm.AdvanceActionListener.class),
@EventConfig(phase = Phase.DECODE, listeners = UIPreferencesForm.BackActionListener.class)
})
public class UIPreferencesForm extends UIForm implements UIPopupComponent {
final static public String FIELD_ENABLESTRUCTURE = "enableStructure";
final static public String FIELD_SHOWSIDEBAR = "showSideBar";
final static public String FIELD_SHOWNONDOCUMENT = "showNonDocument";
final static public String FIELD_SHOWREFDOCUMENTS = "showRefDocuments";
final static public String FIELD_SHOW_HIDDEN_NODE = "showHiddenNode";
final static public String FIELD_SHOW_ITEMS_BY_USER = "showItemsByUserInTimeline";
final static public String FIELD_ENABLE_DRAG_AND_DROP = "enableDragAndDrop";
final static public String FIELD_SHORTBY = "sortBy";
final static public String FIELD_ORDERBY = "order";
final static public String FIELD_PROPERTY = "property";
final static public String NODES_PER_PAGE = "nodesPerPage";
final static public String FIELD_QUERY_TYPE = "queryType";
private boolean advancePreferences = false;
public UIPreferencesForm() throws Exception {
RequestContext context = RequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
String sortByNodeName;
String sortByNodeType;
String sortByCreatedDate;
String sortByModifiedDate;
String ascendingOrder;
String descendingOrder;
String SQLQuery;
String XPathQuery;
try {
sortByNodeName = res.getString("UIPreferencesForm.label." + NodetypeConstant.SORT_BY_NODENAME);
sortByNodeType = res.getString("UIPreferencesForm.label." + NodetypeConstant.SORT_BY_NODETYPE);
sortByCreatedDate = res.getString("UIPreferencesForm.label." + NodetypeConstant.SORT_BY_CREATED_DATE);
sortByModifiedDate = res.getString("UIPreferencesForm.label." + NodetypeConstant.SORT_BY_MODIFIED_DATE);
ascendingOrder = res.getString("UIPreferencesForm.label." + Preference.ASCENDING_ORDER);
descendingOrder = res.getString("UIPreferencesForm.label." + Preference.DESCENDING_ORDER);
SQLQuery = res.getString("UIPreferencesForm.label." + Preference.SQL_QUERY);
XPathQuery = res.getString("UIPreferencesForm.label." + Preference.XPATH_QUERY);
} catch (Exception e) {
sortByNodeName = NodetypeConstant.SORT_BY_NODENAME;
sortByNodeType = NodetypeConstant.SORT_BY_NODETYPE;
sortByCreatedDate = NodetypeConstant.SORT_BY_CREATED_DATE;
sortByModifiedDate = NodetypeConstant.SORT_BY_MODIFIED_DATE;
ascendingOrder = Preference.ASCENDING_ORDER;
descendingOrder = Preference.DESCENDING_ORDER;
SQLQuery = Preference.SQL_QUERY;
XPathQuery = Preference.XPATH_QUERY;
}
List<SelectItemOption<String>> sortOptions = new ArrayList<SelectItemOption<String>>();
sortOptions.add(new SelectItemOption<String>(sortByNodeName, NodetypeConstant.SORT_BY_NODENAME));
sortOptions.add(new SelectItemOption<String>(sortByNodeType, NodetypeConstant.SORT_BY_NODETYPE));
sortOptions.add(new SelectItemOption<String>(sortByCreatedDate, NodetypeConstant.SORT_BY_CREATED_DATE));
sortOptions.add(new SelectItemOption<String>(sortByModifiedDate, NodetypeConstant.SORT_BY_MODIFIED_DATE));
List<SelectItemOption<String>> orderOption = new ArrayList<SelectItemOption<String>>();
orderOption.add(new SelectItemOption<String>(ascendingOrder, Preference.ASCENDING_ORDER));
orderOption.add(new SelectItemOption<String>(descendingOrder, Preference.DESCENDING_ORDER));
List<SelectItemOption<String>> nodesPerPagesOptions = new ArrayList<SelectItemOption<String>>();
nodesPerPagesOptions.add(new SelectItemOption<String>("5", "5"));
nodesPerPagesOptions.add(new SelectItemOption<String>("10", "10"));
nodesPerPagesOptions.add(new SelectItemOption<String>("15", "15"));
nodesPerPagesOptions.add(new SelectItemOption<String>("20", "20"));
nodesPerPagesOptions.add(new SelectItemOption<String>("30", "30"));
nodesPerPagesOptions.add(new SelectItemOption<String>("40", "40"));
nodesPerPagesOptions.add(new SelectItemOption<String>("50", "50"));
List<SelectItemOption<String>> queryOption = new ArrayList<SelectItemOption<String>>();
queryOption.add(new SelectItemOption<String>(SQLQuery, Preference.SQL_QUERY));
queryOption.add(new SelectItemOption<String>(XPathQuery, Preference.XPATH_QUERY));
addUIFormInput(new UICheckBoxInput(FIELD_ENABLESTRUCTURE, FIELD_ENABLESTRUCTURE, null));
addUIFormInput(new UICheckBoxInput(FIELD_SHOWSIDEBAR, FIELD_SHOWSIDEBAR, null));
addUIFormInput(new UICheckBoxInput(FIELD_SHOWNONDOCUMENT, FIELD_SHOWNONDOCUMENT, null));
addUIFormInput(new UICheckBoxInput(FIELD_SHOWREFDOCUMENTS, FIELD_SHOWREFDOCUMENTS, null));
addUIFormInput(new UICheckBoxInput(FIELD_SHOW_HIDDEN_NODE, FIELD_SHOW_HIDDEN_NODE, null));
addUIFormInput(new UICheckBoxInput(FIELD_SHOW_ITEMS_BY_USER, FIELD_SHOW_ITEMS_BY_USER, null));
addUIFormInput(new UICheckBoxInput(FIELD_ENABLE_DRAG_AND_DROP, FIELD_ENABLE_DRAG_AND_DROP, null));
addUIFormInput(new UIFormSelectBox(FIELD_QUERY_TYPE, FIELD_QUERY_TYPE, queryOption));
addUIFormInput(new UIFormSelectBox(FIELD_SHORTBY, FIELD_SHORTBY, sortOptions));
addUIFormInput(new UIFormSelectBox(FIELD_ORDERBY, FIELD_ORDERBY, orderOption));
addUIFormInput(new UIFormSelectBox(NODES_PER_PAGE, NODES_PER_PAGE, nodesPerPagesOptions));
}
public boolean isAdvancePreferences() {
return advancePreferences;
}
public void setAdvancePreferences(boolean adPreferences) {
advancePreferences = adPreferences;
}
public void begin() throws Exception {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
String b = context.getURLBuilder().createURL(this, null, null);
Writer writer = context.getWriter();
writer.append("<form class=\"")
.append(getId())
.append("\" id=\"")
.append(getId())
.append("\" action=\"")
.append(b)
.append('\"');
if (getSubmitAction() != null)
writer.append(" onsubmit=\"").append(getSubmitAction()).append("\"");
if (isMultipart())
writer.append(" enctype=\"multipart/form-data\"");
writer.append(" method=\"post\">");
writer.append("<div><input type=\"hidden\" name=\"")
.append(ACTION)
.append("\" value=\"\"/></div>");
}
public void activate() {
}
public void deActivate() {
}
public void update(Preference pref) {
getUICheckBoxInput(FIELD_ENABLESTRUCTURE).setChecked(pref.isJcrEnable());
UICheckBoxInput showSideBar = getUICheckBoxInput(FIELD_SHOWSIDEBAR);
showSideBar.setChecked(pref.isShowSideBar());
showSideBar.setDisabled(!this.getAncestorOfType(UIJCRExplorerPortlet.class).isShowSideBar());
getUICheckBoxInput(FIELD_SHOWNONDOCUMENT).setChecked(pref.isShowNonDocumentType());
getUICheckBoxInput(FIELD_SHOWREFDOCUMENTS).setChecked(pref.isShowPreferenceDocuments());
getUICheckBoxInput(FIELD_SHOW_HIDDEN_NODE).setChecked(pref.isShowHiddenNode());
getUICheckBoxInput(FIELD_SHOW_ITEMS_BY_USER).setChecked(pref.isShowItemsByUser());
getUICheckBoxInput(FIELD_ENABLE_DRAG_AND_DROP).setChecked(pref.isEnableDragAndDrop());
getUIFormSelectBox(FIELD_SHORTBY).setValue(pref.getSortType());
getUIFormSelectBox(FIELD_ORDERBY).setValue(pref.getOrder());
getUIFormSelectBox(NODES_PER_PAGE).setValue(Integer.toString(pref.getNodesPerPage()));
getUIFormSelectBox(FIELD_QUERY_TYPE).setValue(pref.getQueryType());
}
private Cookie createNewCookie(String cookieName, String cookieValue) {
String userId = Util.getPortalRequestContext().getRemoteUser();
cookieName += userId;
return new Cookie(cookieName, cookieValue);
}
private void savePreferenceInCookies() {
HttpServletResponse response = Util.getPortalRequestContext().getResponse();
if (getUICheckBoxInput(FIELD_ENABLESTRUCTURE).isChecked())
response.addCookie(createNewCookie(Preference.PREFERENCE_ENABLESTRUCTURE, "true"));
else
response.addCookie(createNewCookie(Preference.PREFERENCE_ENABLESTRUCTURE, "false"));
if (getUICheckBoxInput(FIELD_SHOWSIDEBAR).isChecked())
response.addCookie(createNewCookie(Preference.PREFERENCE_SHOWSIDEBAR, "true"));
else
response.addCookie(createNewCookie(Preference.PREFERENCE_SHOWSIDEBAR, "false"));
if (getUICheckBoxInput(FIELD_SHOWNONDOCUMENT).isChecked())
response.addCookie(createNewCookie(Preference.SHOW_NON_DOCUMENTTYPE, "true"));
else
response.addCookie(createNewCookie(Preference.SHOW_NON_DOCUMENTTYPE, "false"));
if (getUICheckBoxInput(FIELD_SHOWREFDOCUMENTS).isChecked())
response.addCookie(createNewCookie(Preference.PREFERENCE_SHOWREFDOCUMENTS, "true"));
else
response.addCookie(createNewCookie(Preference.PREFERENCE_SHOWREFDOCUMENTS, "false"));
if (getUICheckBoxInput(FIELD_SHOW_HIDDEN_NODE).isChecked())
response.addCookie(createNewCookie(Preference.PREFERENCE_SHOW_HIDDEN_NODE, "true"));
else
response.addCookie(createNewCookie(Preference.PREFERENCE_SHOW_HIDDEN_NODE, "false"));
if (getUICheckBoxInput(FIELD_ENABLE_DRAG_AND_DROP).isChecked())
response.addCookie(createNewCookie(Preference.ENABLE_DRAG_AND_DROP, "true"));
else
response.addCookie(createNewCookie(Preference.ENABLE_DRAG_AND_DROP, "false"));
response.addCookie(createNewCookie(Preference.PREFERENCE_QUERY_TYPE, getUIFormSelectBox(FIELD_QUERY_TYPE).getValue()));
response.addCookie(createNewCookie(Preference.PREFERENCE_SORT_BY, getUIFormSelectBox(FIELD_SHORTBY).getValue()));
response.addCookie(createNewCookie(Preference.PREFERENCE_ORDER_BY, getUIFormSelectBox(FIELD_ORDERBY).getValue()));
response.addCookie(createNewCookie(Preference.NODES_PER_PAGE, getUIFormSelectBox(NODES_PER_PAGE).getValue()));
}
static public class SaveActionListener extends EventListener<UIPreferencesForm> {
public void execute(Event<UIPreferencesForm> event) throws Exception {
UIPreferencesForm uiForm = event.getSource();
UIJCRExplorerPortlet explorerPorltet = uiForm.getAncestorOfType(UIJCRExplorerPortlet.class);
UIJCRExplorer uiExplorer = explorerPorltet.findFirstComponentOfType(UIJCRExplorer.class);
Preference pref = uiExplorer.getPreference();
pref.setJcrEnable(uiForm.getUICheckBoxInput(FIELD_ENABLESTRUCTURE).isChecked());
pref.setShowSideBar(uiForm.getUICheckBoxInput(FIELD_SHOWSIDEBAR).isChecked());
pref.setShowNonDocumentType(uiForm.getUICheckBoxInput(FIELD_SHOWNONDOCUMENT).isChecked());
pref.setShowPreferenceDocuments(uiForm.getUICheckBoxInput(FIELD_SHOWREFDOCUMENTS).isChecked());
pref.setShowHiddenNode(uiForm.getUICheckBoxInput(FIELD_SHOW_HIDDEN_NODE).isChecked());
if (pref.isShowHiddenNode()) {
uiExplorer.getAllItemFilterMap().add(NodetypeConstant.HIDDEN);
} else {
uiExplorer.getAllItemFilterMap().remove(NodetypeConstant.HIDDEN);
}
pref.setEnableDragAndDrop(uiForm.getUICheckBoxInput(FIELD_ENABLE_DRAG_AND_DROP).isChecked());
pref.setSortType(uiForm.getUIFormSelectBox(FIELD_SHORTBY).getValue());
pref.setQueryType(uiForm.getUIFormSelectBox(FIELD_QUERY_TYPE).getValue());
pref.setOrder(uiForm.getUIFormSelectBox(FIELD_ORDERBY).getValue());
pref.setNodesPerPage(Integer.parseInt(uiForm.getUIFormSelectBox(NODES_PER_PAGE).getValue()));
uiForm.savePreferenceInCookies();
uiExplorer.setPreferencesSaved(true);
uiExplorer.refreshExplorer();
explorerPorltet.setRenderedChild(UIJCRExplorer.class);
uiExplorer.updateAjax(event);
}
}
static public class BackActionListener extends EventListener<UIPreferencesForm> {
public void execute(Event<UIPreferencesForm> event) throws Exception {
UIPreferencesForm uiForm = event.getSource();
UIJCRExplorerPortlet explorerPorltet = uiForm.getAncestorOfType(UIJCRExplorerPortlet.class);
UIJCRExplorer uiExplorer = explorerPorltet.findFirstComponentOfType(UIJCRExplorer.class);
uiExplorer.getChild(UIPopupContainer.class).cancelPopupAction();
}
}
static public class AdvanceActionListener extends EventListener<UIPreferencesForm> {
public void execute(Event<UIPreferencesForm> event) throws Exception {
UIPreferencesForm uiPreferencesForm = event.getSource();
if (uiPreferencesForm.isAdvancePreferences()) {
uiPreferencesForm.setAdvancePreferences(false);
}
else {
uiPreferencesForm.setAdvancePreferences(true);
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiPreferencesForm.getParent());
}
}
}