UIPageNodeSelector.java
/*
* 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.wcm.webui.selector.page;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.exoplatform.portal.mop.user.UserNavigation;
import org.exoplatform.portal.mop.user.UserNode;
import org.exoplatform.portal.mop.user.UserPortal;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.wcm.navigation.NavigationUtils;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.core.UIDropDownControl;
import org.exoplatform.webui.core.UIRightClickPopupMenu;
import org.exoplatform.webui.core.UITree;
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;
/**
* Created by The eXo Platform SARL
* Author : chungnv
* nguyenchung136@yahoo.com
* Jun 23, 2006
* 10:07:15 AM
*/
@ComponentConfigs({
@ComponentConfig(
template = "classpath:groovy/wcm/webui/selector/page/UIPageNodeSelector.gtmpl" ,
events = {
@EventConfig(listeners = UIPageNodeSelector.SelectNavigationActionListener.class, phase=Phase.DECODE)
}
),
@ComponentConfig (
type = UIDropDownControl.class ,
id = "UIDropDown",
template = "classpath:groovy/wcm/webui/selector/page/UINavigationSelector.gtmpl",
events = {
@EventConfig(listeners = UIPageNodeSelector.SelectNavigationActionListener.class)
}
)
})
public class UIPageNodeSelector extends UIContainer {
/** The navigations. */
private List<UserNavigation> navigations;
/** The selected node. */
private SelectedNode selectedNode;
/** The copy node. */
private SelectedNode copyNode;
/** The delete navigations. */
private List<UserNavigation> deleteNavigations = new ArrayList<UserNavigation>();
/** the user portal */
private UserPortal userPortal;
/**
* Instantiates a new uI page node selector.
*
* @throws Exception the exception
*/
public UIPageNodeSelector() throws Exception {
userPortal = Util.getPortalRequestContext().getUserPortalConfig().getUserPortal();
UIDropDownControl uiDopDownControl = addChild(UIDropDownControl.class, "UIDropDown", "UIDropDown");
uiDopDownControl.setParent(this);
UITree uiTree = addChild(UITree.class, null, "TreeNodeSelector");
uiTree.setIcon("DefaultPageIcon");
uiTree.setSelectedIcon("DefaultPageIcon");
uiTree.setBeanIdField("URI");
uiTree.setBeanChildCountField("ChildrenCount");
uiTree.setBeanLabelField("encodedResolvedLabel");
uiTree.setBeanIconField("icon");
loadNavigations();
}
/**
* Load navigations.
*
* @throws Exception the exception
*/
public void loadNavigations() throws Exception {
// get all navigations
navigations = new ArrayList<UserNavigation>();
navigations.addAll(userPortal.getNavigations());
// check navigation list
if (navigations == null || navigations.size() <= 0) {
getChild(UIDropDownControl.class).setOptions(null);
getChild(UITree.class).setSibbling(null);
return;
}
// set option values for navigation selector dropdown
updateNavigationSelector();
// choose one navigation and show it on UI
chooseAndShowNavigation();
}
/**
* Choose one navigation and show it on UI
*
* @throws Exception
*/
private void chooseAndShowNavigation() throws Exception {
// select the navigation of current portal
String currentPortalName = Util.getPortalRequestContext().getUserPortalConfig().getPortalName();
UserNavigation portalSelectedNav = NavigationUtils.getUserNavigationOfPortal( userPortal, currentPortalName);
int portalSelectedNavId = getId(portalSelectedNav);
if (getUserNavigation(portalSelectedNavId) != null) {
selectNavigation(portalSelectedNavId);
UserNode portalSelectedNode = Util.getUIPortal().getSelectedUserNode();
if (portalSelectedNode != null)
selectUserNodeByUri(portalSelectedNode.getURI());
return;
}
// select the first navigation
UserNavigation firstNav = navigations.get(0);
selectNavigation(getId(firstNav));
UserNode rootNode = userPortal.getNode(firstNav,
NavigationUtils.ECMS_NAVIGATION_SCOPE,
null, null);
Iterator<UserNode> childrenIter = rootNode.getChildren().iterator();
if (childrenIter.hasNext()) {
selectUserNodeByUri(childrenIter.next().getURI());
}
}
/**
*/
public int getId(UserNavigation nav) {
return (nav.getKey().getTypeName() + "::" + nav.getKey().getName()).hashCode();
}
/**
* get index of a navigation in navigation list
*
* @param navId the identify of navigation
* @return the index of the navigation in navigation list
*/
private int getIndex(int navId) {
int index = -1;
if (navigations == null || navigations.size() <= 0) {
return index;
}
for (int i = 0; i < navigations.size(); i++) {
UserNavigation nav = navigations.get(i);
if (getId(nav) == navId) {
index = i;
break;
}
}
return index;
}
/**
* Set option values for navigation selector dropdown
*/
private void updateNavigationSelector() {
List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>();
for (UserNavigation navigation : navigations) {
options.add(new SelectItemOption<String>(navigation.getKey().getTypeName() + ":"
+ navigation.getKey().getName(), String.valueOf(getId(navigation))));
}
UIDropDownControl uiNavigationSelector = getChild(UIDropDownControl.class);
uiNavigationSelector.setOptions(options);
if (options.size() > 0)
uiNavigationSelector.setValue(0);
}
/**
* Select navigation.
*
* @param id the id
*/
public void selectNavigation(int id) throws Exception {
UserNavigation selectedNav = getUserNavigation(id);
if (selectedNav == null) {
return;
}
UserNode rootNode = userPortal.getNode(selectedNav,
NavigationUtils.ECMS_NAVIGATION_SCOPE,
null,
null);
selectedNode = new SelectedNode(selectedNav, rootNode, null, null);
selectUserNodeByUri(null);
// update tree
UITree uiTree = getChild(UITree.class);
uiTree.setSibbling(rootNode.getChildren());
// update dropdown
UIDropDownControl uiDropDownSelector = getChild(UIDropDownControl.class);
uiDropDownSelector.setValue(getIndex(id));
}
/**
* Select page node by uri.
*
* @param uri the uri
*/
public void selectUserNodeByUri(String uri) throws Exception {
if (selectedNode == null || uri == null)
return;
UITree tree = getChild(UITree.class);
Collection<?> sibbling = tree.getSibbling();
tree.setSibbling(null);
tree.setParentSelected(null);
UserNavigation selectedNav = selectedNode.getUserNavigation();
UserNode userNode = userPortal.resolvePath(selectedNav, null, uri);
if (userNode != null) {
userPortal.updateNode(userNode, NavigationUtils.ECMS_NAVIGATION_SCOPE, null);
if (userNode != null) {
// selectedNode.setNode(searchUserNodeByUri(selectedNode.getRootNode(), uri));
selectedNode.setNode(userNode);
selectedNode.setParentNode(userNode.getParent());
tree.setParentSelected(selectedNode.getParentNode());
tree.setSibbling(selectedNode.getParentNode().getChildren());
tree.setSelected(selectedNode.getNode());
tree.setChildren(selectedNode.getNode().getChildren());
return;
}
}
tree.setSelected(null);
tree.setChildren(null);
tree.setSibbling(sibbling);
}
/**
* Gets the user navigations.
*
* @return the page navigations
*/
public List<UserNavigation> getUserNavigations() {
if(navigations == null) navigations = new ArrayList<UserNavigation>();
return navigations;
}
/**
* Gets the user navigation.
*
* @param id the id
* @return the page navigation
*/
public UserNavigation getUserNavigation(int id) {
for (UserNavigation nav : getUserNavigations()) {
if (getId(nav) == id)
return nav;
}
return null;
}
/* (non-Javadoc)
* @see org.exoplatform.webui.core.UIComponent#processRender(org.exoplatform.webui.application.WebuiRequestContext)
*/
public void processRender(WebuiRequestContext context) throws Exception {
UIRightClickPopupMenu uiPopupMenu = getChild(UIRightClickPopupMenu.class);
if(uiPopupMenu != null) {
if(navigations == null || navigations.size() < 1) uiPopupMenu.setRendered(false) ;
else uiPopupMenu.setRendered(true) ;
}
super.processRender(context) ;
}
/**
* Gets the copy node.
*
* @return the copy node
*/
public SelectedNode getCopyNode() { return copyNode; }
/**
* Sets the copy node.
*
* @param copyNode the new copy node
*/
public void setCopyNode(SelectedNode copyNode) { this.copyNode = copyNode; }
/**
* The listener interface for receiving selectNavigationAction events.
* The class that is interested in processing a selectNavigationAction
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addSelectNavigationActionListener</code> method. When
* the selectNavigationAction event occurs, that object's appropriate
* method is invoked.
*/
static public class SelectNavigationActionListener extends EventListener<UIDropDownControl> {
/* (non-Javadoc)
* @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
*/
public void execute(Event<UIDropDownControl> event) throws Exception {
String id = event.getRequestContext().getRequestParameter(OBJECTID);
UIDropDownControl uiDropDownControl = event.getSource();
UIPageNodeSelector uiPageNodeSelector = uiDropDownControl.getAncestorOfType(UIPageNodeSelector.class);
event.getRequestContext().addUIComponentToUpdateByAjax(uiPageNodeSelector.getParent()) ;
if(id != null) uiPageNodeSelector.selectNavigation(Integer.parseInt(id));
try {
UIPageSelector pageSelector = uiPageNodeSelector.getAncestorOfType(UIPageSelector.class);
UIPageSelectorPanel pageSelectorPanel = pageSelector.getChild(UIPageSelectorPanel.class);
pageSelectorPanel.setSelectedNode(uiPageNodeSelector.getSelectedNode().getNode());
pageSelectorPanel.updateGrid();
event.getRequestContext().addUIComponentToUpdateByAjax(pageSelector);
} catch (Exception ex) {
org.exoplatform.wcm.webui.Utils.createPopupMessage(uiPageNodeSelector,
"UIMessageBoard.msg.select-navigation",
null,
ApplicationMessage.ERROR);
}
uiPageNodeSelector.<UIComponent> getParent().broadcast(event, event.getExecutionPhase());
}
}
/**
* The Class SelectedNode.
*/
public static class SelectedNode {
/** The nav. */
private UserNavigation nav;
/** The parent node. */
private UserNode parentNode;
/** The node. */
private UserNode node;
private UserNode rootNode;
/** The delete node. */
private boolean deleteNode = false;
/** The clone node. */
private boolean cloneNode = false;
/**
* Instantiates a new selected node.
*
* @param nav the nav
* @param parentNode the parent node
* @param node the node
*/
public SelectedNode(UserNavigation nav, UserNode rootNode, UserNode parentNode, UserNode node) {
this.nav = nav;
this.rootNode = rootNode;
this.parentNode = parentNode;
this.node = node;
}
/**
* Gets the user navigation.
*
* @return the user navigation
*/
public UserNavigation getUserNavigation() {
return nav;
}
/**
* Sets the page navigation.
*
* @param nav the new page navigation
*/
public void setUserNavigation(UserNavigation nav) {
this.nav = nav;
}
/**
* Gets the root node
*
* @return the root node
*/
public UserNode getRootNode() {
return rootNode;
}
/**
* Sets the root node
*
* @param rootNode the root node
*/
public void setRootNode(UserNode rootNode) {
this.rootNode = rootNode;
}
/**
* Gets the parent node.
*
* @return the parent node
*/
public UserNode getParentNode() {
return parentNode;
}
/**
* Sets the parent node.
*
* @param parentNode the new parent node
*/
public void setParentNode(UserNode parentNode) {
this.parentNode = parentNode;
}
/**
* Gets the node.
*
* @return the node
*/
public UserNode getNode() {
return node;
}
/**
* Sets the node.
*
* @param node the new node
*/
public void setNode(UserNode node) {
this.node = node;
}
/**
* Checks if is delete node.
*
* @return true, if is delete node
*/
public boolean isDeleteNode() {
return deleteNode;
}
/**
* Sets the delete node.
*
* @param deleteNode the new delete node
*/
public void setDeleteNode(boolean deleteNode) {
this.deleteNode = deleteNode;
}
/**
* Checks if is clone node.
*
* @return true, if is clone node
*/
public boolean isCloneNode() {
return cloneNode;
}
/**
* Sets the clone node.
*
* @param b the new clone node
*/
public void setCloneNode(boolean b) {
cloneNode = b;
}
}
/**
* Gets the selected node.
*
* @return the selected node
*/
public SelectedNode getSelectedNode() {
return selectedNode;
}
/**
* Gets the selected navigation.
*
* @return the selected navigation
*/
public UserNavigation getSelectedNavigation() {
return selectedNode == null ? null : selectedNode.getUserNavigation();
}
/**
* Gets the root node of the selected navigation.
*
* @return the root node of the selected navigation.
*/
public UserNode getRootNodeOfSelectedNav() {
return selectedNode == null ? null : selectedNode.getRootNode();
}
/**
* Gets the selected page node.
*
* @return the selected page node
*/
public UserNode getSelectedUserNode() {
return selectedNode == null ? null : selectedNode.getNode();
}
/**
* Gets the up level uri.
*
* @return the up level uri
*/
public String getUpLevelUri() {
return selectedNode.getParentNode().getURI();
}
/**
* Gets the delete navigations.
*
* @return the delete navigations
*/
public List<UserNavigation> getDeleteNavigations() {
return deleteNavigations;
}
}