/* * 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.admin.templates; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.PathNotFoundException; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeIterator; import javax.jcr.nodetype.NodeTypeManager; import org.exoplatform.commons.utils.LazyPageList; import org.exoplatform.commons.utils.ListAccess; import org.exoplatform.commons.utils.ListAccessImpl; import org.exoplatform.ecm.webui.core.UIPagingGrid; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.context.DocumentContext; import org.exoplatform.services.wcm.utils.WCMCoreUtils; 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.UIPopupWindow; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; /** * Created by The eXo Platform SARL * Author : pham tuan * phamtuanchip@yahoo.de * Oct 03, 2006 * 9:43:23 AM */ @ComponentConfig( template = "app:/groovy/webui/component/admin/template/UITemplateList.gtmpl", events = { @EventConfig(listeners = UITemplateList.EditActionListener.class), @EventConfig(listeners = UITemplateList.DeleteActionListener.class, confirm = "UITemplateList.msg.confirm-delete"), @EventConfig(listeners = UITemplateList.AddNewActionListener.class) } ) public class UITemplateList extends UIPagingGrid { private static String[] NODETYPE_BEAN_FIELD = {"icon", "label", "name"} ; private static String[] NODETYPE_ACTION = {"Edit", "Delete"} ; public static final String DOCUMENTS_TEMPLATE_TYPE = "templates"; public static final String ACTIONS_TEMPLATE_TYPE = "actions"; public static final String OTHERS_TEMPLATE_TYPE = "others"; public static final String LABEL_PROPERTY = "label"; public static final String ICON_FIELD = "icon"; public static final String LABEL_FIELD = "label"; private String filter = DOCUMENTS_TEMPLATE_TYPE; public void setTemplateFilter(String filter) { this.filter = filter; } public String getTemplateFilter() { return this.filter; } public UITemplateList() throws Exception { configure("name", NODETYPE_BEAN_FIELD, NODETYPE_ACTION) ; } public String[] getActions() { return new String[] {"AddNew"} ; } static public class TemplateComparator implements Comparator<TemplateData> { public int compare(TemplateData t1, TemplateData t2) throws ClassCastException { String name1 = t1.getName(); String name2 = t2.getName(); return name1.compareToIgnoreCase(name2); } } static public class EditActionListener extends EventListener<UITemplateList> { public void execute(Event<UITemplateList> event) throws Exception { UITemplateList nodeTemplateList = event.getSource() ; UITemplatesManager uiManager = nodeTemplateList.getAncestorOfType(UITemplatesManager.class); UITemplateContainer uiTemplateContainer = uiManager.getChildById(uiManager.getSelectedTabId()) ; String nodeType = event.getRequestContext().getRequestParameter(OBJECTID) ; UIViewTemplate uiViewTemplate = uiTemplateContainer.createUIComponent(UIViewTemplate.class, null, "UIViewTemplate" + "_" + uiManager.getSelectedTabId()) ; uiViewTemplate.getChild(UITemplateEditForm.class).update(nodeType) ; uiViewTemplate.setNodeTypeName(nodeType) ; UIDialogTab uiDialogTab = uiViewTemplate.findFirstComponentOfType(UIDialogTab.class) ; uiDialogTab.updateGrid(nodeType) ; UITemplateContent uiDialogTabForm = uiViewTemplate.findComponentById(UIDialogTab.DIALOG_FORM_NAME) ; uiDialogTabForm.setNodeTypeName(nodeType) ; uiDialogTabForm.update(null) ; UIViewTab uiViewTab = uiViewTemplate.findFirstComponentOfType(UIViewTab.class) ; uiViewTab.updateGrid(nodeType) ; UITemplateContent uiViewTabForm = uiViewTemplate.findComponentById(UIViewTab.VIEW_FORM_NAME) ; uiViewTabForm.setNodeTypeName(nodeType) ; uiViewTabForm.update(null) ; UISkinTab uiSkinTab = uiViewTemplate.findFirstComponentOfType(UISkinTab.class) ; uiSkinTab.updateGrid(nodeType) ; UITemplateContent uiSkinTabForm = uiViewTemplate.findComponentById(UISkinTab.SKIN_FORM_NAME) ; uiSkinTabForm.setNodeTypeName(nodeType) ; uiSkinTabForm.update(null); uiManager.initPopup(uiViewTemplate); UIPopupWindow uiPopup = uiManager.getChildById(UITemplatesManager.POPUP_TEMPLATE_ID); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup) ; } } static public class DeleteActionListener extends EventListener<UITemplateList> { public void execute(Event<UITemplateList> event) throws Exception { UITemplatesManager uiTemplatesManager = event.getSource().getAncestorOfType(UITemplatesManager.class); UITemplateContainer uiTemplateContainer = uiTemplatesManager.getChildById(uiTemplatesManager.getSelectedTabId()); UITemplateList uiTemplateList = uiTemplateContainer.getChild(UITemplateList.class); if (uiTemplatesManager.isEditingTemplate()) { UIApplication uiApp = event.getSource().getAncestorOfType(UIApplication.class) ; uiApp.addMessage(new ApplicationMessage("UITemplateList.msg.editing-template", null, ApplicationMessage.WARNING)) ; return; } String nodeType = event.getRequestContext().getRequestParameter(OBJECTID); TemplateService templateService = uiTemplateList.getApplicationComponent(TemplateService.class); try { DocumentContext.getCurrent().getAttributes().put(DocumentContext.IS_SKIP_RAISE_ACT, true); templateService.removeManagedNodeType(nodeType); } catch (PathNotFoundException ex) { UIApplication uiApp = event.getSource().getAncestorOfType(UIApplication.class) ; uiApp.addMessage(new ApplicationMessage("UITemplateList.msg.template-not-exist", null, ApplicationMessage.WARNING)) ; return; } uiTemplateList.refresh(uiTemplateList.getUIPageIterator().getCurrentPage()); event.getRequestContext().addUIComponentToUpdateByAjax(uiTemplatesManager); } } static public class AddNewActionListener extends EventListener<UITemplateList> { public void execute(Event<UITemplateList> event) throws Exception { UITemplatesManager uiTemplatesManager = event.getSource().getAncestorOfType(UITemplatesManager.class) ; UITemplateContainer uiTemplateContainer = uiTemplatesManager.getChildById(uiTemplatesManager.getSelectedTabId()); UITemplateList uiList = uiTemplateContainer.getChild(UITemplateList.class); UITemplateForm uiTemplateForm = uiTemplateContainer.createUIComponent(UITemplateForm.class, null, null) ; uiTemplateForm.setFilter(uiList.getTemplateFilter()); uiTemplateForm.refresh(); uiTemplatesManager.initPopup(uiTemplateForm); UIPopupWindow uiPopup = uiTemplatesManager.getChildById(UITemplatesManager.POPUP_TEMPLATE_ID); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup) ; } } static public class TemplateData { private String name ; private String label; private String icon; public TemplateData(String dataName, String dataLabel, String dataIcon) { name = dataName ; label = dataLabel; icon = dataIcon; } public String getName() { return name ; } public String getLabel() { return label; } public String getIcon() { return icon; } } @Override public void refresh(int currentPage) throws Exception { TemplateService templateService = getApplicationComponent(TemplateService.class); List<String> documentNodeTypes = templateService.getAllDocumentNodeTypes(); Node templatesHome = templateService.getTemplatesHome(WCMCoreUtils.getUserSessionProvider()); List<TemplateData> templateData = new ArrayList<TemplateData>(); if (templatesHome != null) { NodeTypeManager ntManager = templatesHome.getSession().getWorkspace().getNodeTypeManager(); NodeTypeIterator nodetypeIter = ntManager.getAllNodeTypes(); List<String> listNodeTypeName = new ArrayList<String>(); while (nodetypeIter.hasNext()) { NodeType n1 = nodetypeIter.nextNodeType(); listNodeTypeName.add(n1.getName()); } NodeIterator nodes = templatesHome.getNodes(); String label = ""; String icon = ""; while (nodes.hasNext()) { Node node = nodes.nextNode(); if (listNodeTypeName.contains(node.getName())) { label = node.hasProperty(LABEL_PROPERTY) ? node.getProperty(LABEL_PROPERTY).getString() : node.getName(); icon = "uiIcon16x16Template" + label.replaceAll(" ", ""); icon = icon + " uiIconFile"; if(filter.equals(DOCUMENTS_TEMPLATE_TYPE)) { if(documentNodeTypes.contains(node.getName())) templateData.add(new TemplateData(node.getName(), label, icon)); } else if(filter.equals(ACTIONS_TEMPLATE_TYPE)) { if(ntManager.getNodeType(node.getName()).isNodeType("exo:action")) templateData.add(new TemplateData(node.getName(), label, icon )); } else { if(!ntManager.getNodeType(node.getName()).isNodeType("exo:action") && !documentNodeTypes.contains(node.getName())) templateData.add(new TemplateData(node.getName(), label, icon )); } } } Collections.sort(templateData, new TemplateComparator()); } ListAccess<TemplateData> dataList = new ListAccessImpl<TemplateData>(TemplateData.class, templateData); LazyPageList<TemplateData> pageList = new LazyPageList<TemplateData>(dataList, getUIPageIterator().getItemsPerPage()); getUIPageIterator().setTotalItems(templateData.size()); getUIPageIterator().setPageList(pageList); if (currentPage > getUIPageIterator().getAvailablePage()) getUIPageIterator().setCurrentPage(getUIPageIterator().getAvailablePage()); else getUIPageIterator().setCurrentPage(currentPage); } }