/*
* Copyright (C) 2003-2009 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.fastcontentcreator.config.action;
import org.exoplatform.commons.utils.LazyPageList;
import org.exoplatform.commons.utils.ListAccess;
import org.exoplatform.commons.utils.ListAccessImpl;
import org.exoplatform.services.cms.actions.ActionServiceContainer;
import org.exoplatform.services.wcm.core.NodeLocation;
import org.exoplatform.wcm.webui.Utils;
import org.exoplatform.wcm.webui.fastcontentcreator.UIFCCPortlet;
import org.exoplatform.wcm.webui.fastcontentcreator.UIFCCConstant;
import org.exoplatform.wcm.webui.fastcontentcreator.UIFCCUtils;
import org.exoplatform.wcm.webui.fastcontentcreator.config.UIFCCConfig;
import org.exoplatform.web.application.ApplicationMessage;
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.UIContainer;
import org.exoplatform.webui.core.UIGrid;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.lifecycle.Lifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import java.util.ArrayList;
import java.util.List;
/**
* Created by The eXo Platform SAS
* Author : eXoPlatform
* chuong.phan@exoplatform.com, phan.le.thanh.chuong@gmail.com
* Jun 25, 2009
*/
@ComponentConfig(
lifecycle = Lifecycle.class,
template = "system:/groovy/FastContentCreatorPortlet/UIFCCActionList.gtmpl",
events = {
@EventConfig(listeners = UIFCCActionList.AddActionListener.class),
@EventConfig(listeners = UIFCCActionList.EditActionListener.class),
@EventConfig(listeners = UIFCCActionList.DeleteActionListener.class,
confirm = "UIFCCActionList.msg.confirm-delete-action")
}
)
public class UIFCCActionList extends UIContainer {
/** The Constant HEADERS. */
private static final String[] HEADERS = {"name", "description", "instanceOf"};
/** The Constant ACTIONS. */
private String[] ACTIONS = {"Edit", "Delete"};
private String mode = null;
/**
* Instantiates a new uIFCC action list.
*
* @throws Exception the exception
*/
public UIFCCActionList() throws Exception {
}
public void init(String mode) throws Exception {
this.mode = mode;
UIGrid grid = addChild(UIGrid.class, null, null);
if ("basic".equals(mode)) {
ACTIONS = new String[]{"Edit"};
}
grid.configure(UIFCCConstant.ACTION_GRID, HEADERS , ACTIONS );
}
/**
* Update grid.
*
* @param node the node
* @param currentPage the current page
*
* @throws Exception the exception
*/
@SuppressWarnings("unchecked")
public void updateGrid(Node node, int currentPage) throws Exception {
UIPageIterator uiIterator = getChild(UIGrid.class).getUIPageIterator();
ListAccess<Object> actionNodeList = new ListAccessImpl<Object>(Object.class,
NodeLocation.getLocationsByNodeList(getAllActions(node)));
LazyPageList<Object> dataPageList = new LazyPageList<Object>(actionNodeList, 10);
uiIterator.setPageList(dataPageList);
if (currentPage > uiIterator.getAvailablePage())
uiIterator.setCurrentPage(uiIterator.getAvailablePage());
else
uiIterator.setCurrentPage(currentPage);
}
/**
* Gets the actions.
*
* @return the actions
*/
public String[] getActions() { return ACTIONS ; }
/**
* Checks for actions.
*
* @return true, if successful
*/
public boolean hasActions() {
UIFCCConfig fastContentCreatorConfig = getAncestorOfType(UIFCCConfig.class) ;
ActionServiceContainer actionService = getApplicationComponent(ActionServiceContainer.class) ;
try {
return actionService.hasActions(fastContentCreatorConfig.getSavedLocationNode());
} catch (Exception e) {
return false;
}
}
/**
* Gets the all actions.
*
* @param node the node
*
* @return the all actions
*/
public List<Node> getAllActions(Node node) {
ActionServiceContainer actionService = getApplicationComponent(ActionServiceContainer.class) ;
try {
return actionService.getActions(node);
} catch(Exception e){
return new ArrayList<Node>() ;
}
}
/**
* Gets the list actions.
*
* @return the list actions
*
* @throws Exception the exception
*/
@SuppressWarnings("unchecked")
public List getListActions() throws Exception {
UIPageIterator uiIterator = getChild(UIGrid.class).getUIPageIterator();
return NodeLocation.getNodeListByLocationList(uiIterator.getCurrentPageData());
}
public String getMode() {
return mode;
}
/**
* The listener interface for receiving addAction events.
* The class that is interested in processing a addAction
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addAddActionListener</code> method. When
* the addAction event occurs, that object's appropriate
* method is invoked.
*/
public static class AddActionListener extends EventListener<UIFCCActionList> {
/* (non-Javadoc)
* @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
*/
public void execute(Event<UIFCCActionList> event) throws Exception {
UIFCCActionList fastContentCreatorActionList = event.getSource();
UIFCCActionContainer fastContentCreatorActionContainer = fastContentCreatorActionList.
createUIComponent(UIFCCActionContainer.class,
null,
null);
Utils.createPopupWindow(fastContentCreatorActionList,
fastContentCreatorActionContainer,
UIFCCConstant.ACTION_POPUP_WINDOW,
550);
fastContentCreatorActionContainer.getChild(UIFCCActionTypeForm.class).update();
}
}
/**
* The listener interface for receiving editAction events.
* The class that is interested in processing a editAction
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addEditActionListener</code> method. When
* the editAction event occurs, that object's appropriate
* method is invoked.
*/
public static class EditActionListener extends EventListener<UIFCCActionList> {
/* (non-Javadoc)
* @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
*/
public void execute(Event<UIFCCActionList> event) throws Exception {
UIFCCActionList fastContentCreatorActionList = event.getSource();
String actionName = event.getRequestContext().getRequestParameter(OBJECTID);
UIFCCActionContainer fccActionContainer = fastContentCreatorActionList.createUIComponent(UIFCCActionContainer.class,
null,
null);
Utils.createPopupWindow(fastContentCreatorActionList,
fccActionContainer,
UIFCCConstant.ACTION_POPUP_WINDOW,
550);
UIFCCActionTypeForm fccActionTypeForm = fccActionContainer.getChild(UIFCCActionTypeForm.class);
ActionServiceContainer actionService = fastContentCreatorActionList.getApplicationComponent(ActionServiceContainer.class);
UIFCCConfig fastContentCreatorConfig = fastContentCreatorActionList.getAncestorOfType(UIFCCConfig.class) ;
Node parentNode = fastContentCreatorConfig.getSavedLocationNode();
Node actionNode= actionService.getAction(parentNode, actionName);
fccActionTypeForm.init(actionNode.getPath(), actionNode.getPrimaryNodeType().getName());
fccActionTypeForm.update();
}
}
/**
* The listener interface for receiving deleteAction events.
* The class that is interested in processing a deleteAction
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addDeleteActionListener</code> method. When
* the deleteAction event occurs, that object's appropriate
* method is invoked.
*/
public static class DeleteActionListener extends EventListener<UIFCCActionList> {
/* (non-Javadoc)
* @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
*/
public void execute(Event<UIFCCActionList> event) throws Exception {
UIFCCActionList fastContentCreatorActionList = event.getSource() ;
UIFCCConfig fastContentCreatorConfig = fastContentCreatorActionList.getAncestorOfType(UIFCCConfig.class) ;
ActionServiceContainer actionService = fastContentCreatorActionList.getApplicationComponent(ActionServiceContainer.class) ;
String actionName = event.getRequestContext().getRequestParameter(OBJECTID) ;
UIPopupContainer popupContainer = fastContentCreatorActionList.getAncestorOfType(UIFCCPortlet.class)
.getChild(UIPopupContainer.class);
UIPopupWindow uiPopup = popupContainer.getChildById(UIFCCConstant.ACTION_POPUP_WINDOW) ;
UIApplication uiApp = fastContentCreatorActionList.getAncestorOfType(UIApplication.class) ;
if(uiPopup != null && uiPopup.isShow()) {
uiPopup.setShowMask(true);
uiApp.addMessage(new ApplicationMessage("UIActionList.msg.remove-popup-first",
null,
ApplicationMessage.WARNING));
return ;
}
if (uiPopup != null && uiPopup.isRendered())
popupContainer.removeChildById(UIFCCConstant.ACTION_POPUP_WINDOW);
try {
actionService.removeAction(fastContentCreatorConfig.getSavedLocationNode(),
actionName,
UIFCCUtils.getPreferenceRepository());
} catch(AccessDeniedException ace) {
uiApp.addMessage(new ApplicationMessage("UIActionList.msg.access-denied",
null,
ApplicationMessage.WARNING));
return ;
}
fastContentCreatorActionList.updateGrid(fastContentCreatorConfig.getSavedLocationNode(),
fastContentCreatorActionList.getChild(UIGrid.class)
.getUIPageIterator()
.getCurrentPage());
event.getRequestContext().addUIComponentToUpdateByAjax(fastContentCreatorConfig) ;
}
}
}