/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.demo.iteration; import java.io.Serializable; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import javax.annotation.PostConstruct; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.IntegerConverter; import javax.faces.event.AbortProcessingException; import javax.faces.event.AjaxBehaviorEvent; import javax.faces.event.FacesEvent; import javax.swing.tree.TreeNode; import org.richfaces.demo.iteration.model.tree.DataHolderTreeNodeImpl; import org.richfaces.log.LogFactory; import org.richfaces.log.Logger; import org.richfaces.model.TreeDataModel; import org.richfaces.component.SwitchType; import org.richfaces.component.AbstractTree; import org.richfaces.component.AbstractTreeNode; import org.richfaces.event.TreeSelectionChangeEvent; import org.richfaces.event.TreeSelectionChangeListener; import org.richfaces.event.TreeToggleEvent; import org.richfaces.event.TreeToggleListener; import org.richfaces.convert.SequenceRowKeyConverter; import org.richfaces.model.SwingTreeNodeDataModelImpl; import org.richfaces.model.SwingTreeNodeImpl; import org.richfaces.model.TreeNodeImpl; /** * @author Nick Belaevski * */ @ManagedBean @SessionScoped public class TreeBean implements Serializable { public static final class SelectionChangeHandler implements TreeSelectionChangeListener { private boolean fromExpression = false; public SelectionChangeHandler() { } public SelectionChangeHandler(boolean fromExpression) { super(); this.fromExpression = fromExpression; } public void processTreeSelectionChange(TreeSelectionChangeEvent event) throws AbortProcessingException { FacesContext facesContext = FacesContext.getCurrentInstance(); facesContext.addMessage(getTree(event).getClientId(facesContext), createEventMessage(event, fromExpression)); } } public static final class ToggleHandler implements TreeToggleListener { private boolean fromExpression = false; public ToggleHandler() { } public ToggleHandler(boolean fromExpression) { super(); this.fromExpression = fromExpression; } public void processTreeToggle(TreeToggleEvent event) throws AbortProcessingException { FacesContext facesContext = FacesContext.getCurrentInstance(); facesContext.addMessage(getTree(event).getClientId(facesContext), createEventMessage(event, fromExpression)); } } private static final long serialVersionUID = 3368885134614548497L; private static final Logger LOGGER = LogFactory.getLogger(TreeBean.class); private static final Converter INTEGER_SEQUENCE_KEY_CONVERTER = new SequenceRowKeyConverter<Integer>(Integer.class, new IntegerConverter()); private List<TreeNode> rootNodes; private List<TreeNode> lazyRootNodes; private TreeDataModel<?> treeDataModel; private SwitchType toggleType = SwitchType.DEFAULT; private SwitchType selectionType = SwitchType.client; private boolean showCustomClasses = true; private Collection<Object> selection = new TracingSet<Object>(); private String toggleNodeEvent = ""; private String executeTestText; private ToggleActionListenerImpl toggleActionListenerImpl = new ToggleActionListenerImpl(); private SelectionChangeActionListenerImpl selectionChangeActionListener; private org.richfaces.model.TreeNode classicTreeNode; private static Object staticGetNodeData() { FacesContext facesContext = FacesContext.getCurrentInstance(); return facesContext.getApplication().evaluateExpressionGet(facesContext, "#{node}", Object.class); } private static FacesMessage createEventMessage(FacesEvent event, boolean fromExpression) { String summary = event + (fromExpression ? " called from attribute" : " called from tag") + ", data: " + staticGetNodeData(); return new FacesMessage(summary); } private static AbstractTree getTree(FacesEvent event) { if (event.getComponent() instanceof AbstractTree) { return (AbstractTree) event.getComponent(); } return ((AbstractTreeNode) event.getComponent()).findTreeComponent(); } private List<TreeNode> createLazyNodes(List<TreeNode> nodes) { List<TreeNode> result = new ArrayList<TreeNode>(nodes.size()); for (TreeNode srcNode : nodes) { result.add(new LazyTreeNode(srcNode)); } return result; } private org.richfaces.model.TreeNode createClassicNode(TreeNode node) { TreeNodeImpl result = new DataHolderTreeNodeImpl(node.isLeaf(), ((SwingTreeNodeImpl<?>) node).getData()); for (int i = 0; i < node.getChildCount(); i++) { result.addChild(i, createClassicNode(node.getChildAt(i))); } return result; } private org.richfaces.model.TreeNode createRootClassicNode(List<TreeNode> nodes) { TreeNodeImpl rootNode = new TreeNodeImpl(); int key = 0; for (TreeNode node : nodes) { rootNode.addChild(key++, createClassicNode(node)); } return rootNode; } @PostConstruct public void init() { try { TreeNodeParser parser = new TreeNodeParser(); parser.parse(TreeBean.class.getResource("plants.xml")); rootNodes = parser.getRootNodes(); lazyRootNodes = createLazyNodes(rootNodes); classicTreeNode = createRootClassicNode(rootNodes); treeDataModel = new SwingTreeNodeDataModelImpl(); treeDataModel.setWrappedData(rootNodes); } catch (Exception e) { LOGGER.error(e.getMessage(), e); } } public List<TreeNode> getRootNodes() { return rootNodes; } public List<TreeNode> getLazyRootNodes() { return lazyRootNodes; } public org.richfaces.model.TreeNode getClassicTreeNode() { return classicTreeNode; } public SwitchType[] getTypes() { return SwitchType.values(); } public SwitchType getToggleType() { return toggleType; } public void setToggleType(SwitchType switchType) { this.toggleType = switchType; } public SwitchType getSelectionType() { return selectionType; } public void setSelectionType(SwitchType selectionMode) { this.selectionType = selectionMode; } public Object getNodeData() { return staticGetNodeData(); } public Collection<Object> getSelection() { return selection; } public void setSelection(Collection<Object> selection) { this.selection = selection; } public void clickNode() { FacesContext facesContext = FacesContext.getCurrentInstance(); facesContext.addMessage(null, new FacesMessage("Clicked node: " + getNodeData())); } public boolean isShowCustomClasses() { return showCustomClasses; } public void setShowCustomClasses(boolean showCustomClasses) { this.showCustomClasses = showCustomClasses; } public void behaviorToggleListener(AjaxBehaviorEvent event) { FacesContext facesContext = FacesContext.getCurrentInstance(); facesContext.addMessage(null, new FacesMessage("Toggle node: " + getNodeData() + ", source is: " + event.getSource())); } public void behaviorSelectionChangeListener(AjaxBehaviorEvent event) { FacesContext facesContext = FacesContext.getCurrentInstance(); facesContext.addMessage(event.getComponent().getClientId(facesContext), new FacesMessage( "Selection changed, source is: " + event.getSource())); } public void processSelectionChange(TreeSelectionChangeEvent event) { new SelectionChangeHandler(true).processTreeSelectionChange(event); } public void processToggle(TreeToggleEvent event) { new ToggleHandler(true).processTreeToggle(event); } public String getToggleNodeEvent() { return toggleNodeEvent; } public void setToggleNodeEvent(String toggleNodeEvent) { this.toggleNodeEvent = toggleNodeEvent; } public String getExecuteTestText() { return executeTestText; } public void setExecuteTestText(String executeTestText) { this.executeTestText = executeTestText; } public String getCurrentTimeAsString() { return DateFormat.getTimeInstance().format(new Date()); } public ToggleActionListenerImpl getToggleActionListenerImpl() { return toggleActionListenerImpl; } public void setToggleActionListenerImpl(ToggleActionListenerImpl toggleActionListenerImpl) { this.toggleActionListenerImpl = toggleActionListenerImpl; } public SelectionChangeActionListenerImpl getSelectionChangeActionListener() { return selectionChangeActionListener; } public void setSelectionChangeActionListener(SelectionChangeActionListenerImpl selectionChangeActionListener) { this.selectionChangeActionListener = selectionChangeActionListener; } public Converter getIntegerSequenceKeyConveter() { return INTEGER_SEQUENCE_KEY_CONVERTER; } public TreeDataModel<?> getTreeDataModel() { return treeDataModel; } }