blob: 2db1d7f7ed8e60aec7ce5ba1a9941e83bbe6d76b [file] [log] [blame]
// Copyright 2004 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.tapestry.contrib.tree.components;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IAsset;
import org.apache.tapestry.IBinding;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRender;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.contrib.tree.model.ITreeModelSource;
import org.apache.tapestry.contrib.tree.model.ITreeRowSource;
import org.apache.tapestry.contrib.tree.model.ITreeStateListener;
import org.apache.tapestry.contrib.tree.model.ITreeStateModel;
import org.apache.tapestry.contrib.tree.model.TreeRowObject;
import org.apache.tapestry.contrib.tree.model.TreeStateEvent;
import org.apache.tapestry.contrib.tree.simple.SimpleNodeRenderFactory;
import org.apache.tapestry.engine.IPageLoader;
import org.apache.tapestry.event.PageDetachListener;
import org.apache.tapestry.event.PageEvent;
import org.apache.tapestry.spec.ComponentSpecification;
import org.apache.tapestry.util.ComponentAddress;
/**
* @version $Id$
**/
public class TreeNodeView extends BaseComponent implements PageDetachListener{
private static final Log LOG = LogFactory.getLog(TreeNodeView.class);
private IBinding m_objNodeRenderFactoryBinding;
private IBinding m_objShowNodeImagesBinding;
private IBinding m_objMakeNodeDirectBinding;
private Boolean m_objNodeState;
private Boolean m_objShowNodeImages;
private Boolean m_objMakeNodeDirect;
private INodeRenderFactory m_objNodeRenderFactory;
private IAsset m_objOpenNodeImage;
private IAsset m_objCloseNodeImage;
public TreeNodeView(){
super();
initialize();
}
private void initialize(){
m_objNodeState = null;
m_objShowNodeImages = null;
m_objNodeRenderFactory = null;
m_objMakeNodeDirect = null;
}
public IRender getCurrentRenderer(){
INodeRenderFactory objRenderFactory = getNodeRenderFactory();
ITreeRowSource objTreeRowSource = getTreeRowSource();
return objRenderFactory.getRender(objTreeRowSource.getTreeRow().getTreeNode(),
getTreeModelSource(),
getPage().getRequestCycle());
}
public Object[] getNodeContext(){
ITreeModelSource objModelSource = getTreeModelSource();
ComponentAddress objModelSourceAddress = new ComponentAddress(objModelSource);
ITreeRowSource objTreeRowSource = getTreeRowSource();
TreeRowObject objTreeRowObject = objTreeRowSource.getTreeRow();
Object objValueUID = objTreeRowObject.getTreeNodeUID();
if (LOG.isDebugEnabled()) {
LOG.debug("getNodeContext objValueUID = " + objValueUID);
}
return new Object[] { objValueUID, new Boolean(isNodeOpen()), objModelSourceAddress };
}
/**
* Called when a node in the tree is clicked by the user.
* If the node is expanded, it will be collapsed, and vice-versa,
* that is, the tree state model is retrieved, and it is told
* to collapse or expand the node.
*
* @param cycle The Tapestry request cycle object.
*/
public void nodeSelect(IRequestCycle cycle) {
Object context[] = cycle.getServiceParameters();
Object objValueUID = null;
if (context != null && context.length > 0) {
objValueUID = context[0];
}
ComponentAddress objModelSourceAddress = (ComponentAddress)context[2];
ITreeModelSource objTreeModelSource = (ITreeModelSource) objModelSourceAddress.findComponent(cycle);
//ITreeModelSource objTreeModelSource = getTreeModelSource();
ITreeStateModel objStateModel = objTreeModelSource.getTreeModel().getTreeStateModel();
boolean bState = objStateModel.isUniqueKeyExpanded(objValueUID);
if (bState) {
objStateModel.collapse(objValueUID);
fireNodeCollapsed(objValueUID, objTreeModelSource);
} else {
objStateModel.expandPath(objValueUID);
fireNodeExpanded(objValueUID, objTreeModelSource);
}
}
private void fireNodeCollapsed(Object objValueUID, ITreeModelSource objTreeModelSource){
deliverEvent(TreeStateEvent.NODE_COLLAPSED, objValueUID, objTreeModelSource);
}
private void fireNodeExpanded(Object objValueUID, ITreeModelSource objTreeModelSource){
deliverEvent(TreeStateEvent.NODE_EXPANDED, objValueUID, objTreeModelSource);
}
private void deliverEvent(int nEventUID, Object objValueUID, ITreeModelSource objTreeModelSource){
ITreeStateListener objListener = objTreeModelSource.getTreeStateListener();
if(objListener != null){
TreeStateEvent objEvent = new TreeStateEvent(nEventUID, objValueUID, objTreeModelSource.getTreeModel().getTreeStateModel());
objListener.treeStateChanged(objEvent);
}
}
private void deliverEventOld(int nEventUID, Object objValueUID, ITreeStateModel objStateModel){
IBinding objBinding = getBinding("treeStateListener");
if(objBinding != null){
ITreeStateListener objListener = (ITreeStateListener)objBinding.getObject();
TreeStateEvent objEvent = new TreeStateEvent(nEventUID, objValueUID, objStateModel);
objListener.treeStateChanged(objEvent);
}
}
public void pageDetached(PageEvent arg0) {
initialize();
}
public void finishLoad(IRequestCycle objCycle, IPageLoader arg0, ComponentSpecification arg1)
{
super.finishLoad(objCycle, arg0, arg1);
getPage().addPageDetachListener(this);
m_objOpenNodeImage = getAsset("_openNodeImage");
m_objCloseNodeImage = getAsset("_closeNodeImage");
}
public boolean isNodeOpen() {
if(m_objNodeState == null){
ITreeRowSource objTreeRowSource = getTreeRowSource();
TreeRowObject objTreeRowObject = objTreeRowSource.getTreeRow();
Object objValueUID = objTreeRowObject.getTreeNodeUID();
ITreeModelSource objTreeModelSource = getTreeModelSource();
ITreeStateModel objStateModel = objTreeModelSource.getTreeModel().getTreeStateModel();
boolean bState = objStateModel.isUniqueKeyExpanded(objValueUID);
m_objNodeState = new Boolean(bState);
}
return m_objNodeState.booleanValue();
}
/**
* Returns the openNodeImage.
* @return IAsset
*/
public IAsset getNodeImage() {
if(isNodeOpen()) {
if (m_objOpenNodeImage == null) {
m_objOpenNodeImage = getAsset("_openNodeImage");
}
return m_objOpenNodeImage;
} else {
if (m_objCloseNodeImage == null) {
m_objCloseNodeImage = getAsset("_closeNodeImage");
}
return m_objCloseNodeImage;
}
}
/**
* Returns the closeNodeImage.
* @return IAsset
*/
public IAsset getCloseNodeImage() {
return m_objCloseNodeImage;
}
/**
* Returns the openNodeImage.
* @return IAsset
*/
public IAsset getOpenNodeImage() {
return m_objOpenNodeImage;
}
/**
* Sets the closeNodeImage.
* @param closeNodeImage The closeNodeImage to set
*/
public void setCloseNodeImage(IAsset closeNodeImage) {
m_objCloseNodeImage = closeNodeImage;
}
/**
* Sets the openNodeImage.
* @param openNodeImage The openNodeImage to set
*/
public void setOpenNodeImage(IAsset openNodeImage) {
m_objOpenNodeImage = openNodeImage;
}
/**
* @see
* org.apache.tapestry.AbstractComponent#renderComponent(IMarkupWriter,
* IRequestCycle)
*/
protected void renderComponent(IMarkupWriter arg0, IRequestCycle arg1) {
super.renderComponent(arg0, arg1);
m_objNodeState = null;
}
/**
* Returns the ShowNodeImagesBinding.
* @return IBinding
*/
public IBinding getShowNodeImagesBinding() {
return m_objShowNodeImagesBinding;
}
/**
* Sets the ShowNodeImagesBinding.
* @param ShowNodeImagesBinding The ShowNodeImagesBinding to set
*/
public void setShowNodeImagesBinding(IBinding ShowNodeImagesBinding) {
m_objShowNodeImagesBinding = ShowNodeImagesBinding;
}
/**
* Returns the ShowNodeImages.
* @return Boolean
*/
public Boolean isShowNodeImages() {
if(m_objShowNodeImages == null){
if(getNodeRenderFactoryBinding() == null){
m_objShowNodeImages = Boolean.TRUE;
} else {
if(m_objShowNodeImagesBinding != null) {
m_objShowNodeImages = (Boolean)
m_objShowNodeImagesBinding.getObject();
} else {
m_objShowNodeImages = Boolean.TRUE;
}
}
}
return m_objShowNodeImages;
}
public boolean getShowImages(){
boolean bResult = isShowNodeImages().booleanValue();
return bResult;
}
public boolean getShowWithoutImages(){
boolean bResult = !isShowNodeImages().booleanValue();
return bResult;
}
public String getOffsetStyle() {
//return "width: " + getTreeDataView().getTreeDeep() * 15;
ITreeRowSource objTreeRowSource = getTreeRowSource();
TreeRowObject objTreeRowObject = objTreeRowSource.getTreeRow();
int nTreeRowDepth = 0;
if(objTreeRowObject != null){
nTreeRowDepth = objTreeRowObject.getTreeRowDepth();
}
return "padding-left: " + nTreeRowDepth * 15+"px";
}
/**
* Returns the nodeRenderFactoryBinding.
* @return IBinding
*/
public IBinding getNodeRenderFactoryBinding() {
return m_objNodeRenderFactoryBinding;
}
/**
* Sets the nodeRenderFactoryBinding.
* @param nodeRenderFactoryBinding The nodeRenderFactoryBinding to set
*/
public void setNodeRenderFactoryBinding(IBinding nodeRenderFactoryBinding) {
m_objNodeRenderFactoryBinding = nodeRenderFactoryBinding;
}
public INodeRenderFactory getNodeRenderFactory() {
if(m_objNodeRenderFactory == null){
IBinding objBinding = getNodeRenderFactoryBinding();
if( objBinding != null){
m_objNodeRenderFactory = (INodeRenderFactory)objBinding.getObject();
}else{
m_objNodeRenderFactory = new SimpleNodeRenderFactory();
}
}
return m_objNodeRenderFactory;
}
/**
* Returns the makeNodeDirectBinding.
* @return IBinding
*/
public IBinding getMakeNodeDirectBinding() {
return m_objMakeNodeDirectBinding;
}
/**
* Sets the makeNodeDirectBinding.
* @param makeNodeDirectBinding The makeNodeDirectBinding to set
*/
public void setMakeNodeDirectBinding(IBinding makeNodeDirectBinding) {
m_objMakeNodeDirectBinding = makeNodeDirectBinding;
}
/**
* Returns the makeNodeDirect.
* @return Boolean
*/
public boolean getMakeNodeDirect() {
if(m_objMakeNodeDirect == null){
IBinding objBinding = getMakeNodeDirectBinding();
if(objBinding != null){
m_objMakeNodeDirect = (Boolean)objBinding.getObject();
}else{
m_objMakeNodeDirect = Boolean.TRUE;
}
}
return m_objMakeNodeDirect.booleanValue();
}
public boolean getMakeNodeNoDirect() {
return !getMakeNodeDirect();
}
public String getCleanSelectedID(){
return getSelectedNodeID();
}
public String getSelectedID(){
ITreeRowSource objTreeRowSource = getTreeRowSource();
ITreeModelSource objTreeModelSource = getTreeModelSource();
TreeRowObject objTreeRowObject = objTreeRowSource.getTreeRow();
Object objNodeValueUID = objTreeRowObject.getTreeNodeUID();
Object objSelectedNode = objTreeModelSource.getTreeModel().getTreeStateModel().getSelectedNode();
if(objNodeValueUID.equals(objSelectedNode)) {
return getSelectedNodeID();
}
return "";
}
private String getSelectedNodeID(){
//return getTreeDataView().getTreeView().getSelectedNodeID();
return "tree";
}
public String getNodeStyleClass() {
ITreeRowSource objTreeRowSource = getTreeRowSource();
ITreeModelSource objTreeModelSource = getTreeModelSource();
TreeRowObject objTreeRowObject = objTreeRowSource.getTreeRow();
boolean bResult = false;
if(objTreeRowObject != null){
Object objNodeValueUID = objTreeRowObject.getTreeNodeUID();
Object objSelectedNode = objTreeModelSource.getTreeModel().getTreeStateModel().getSelectedNode();
bResult = objNodeValueUID.equals(objSelectedNode);
}
if (bResult) {
return "selectedNodeViewClass";
}
return "notSelectedNodeViewClass";
}
public ITreeRowSource getTreeRowSource(){
ITreeRowSource objSource = (ITreeRowSource)getPage().getRequestCycle().getAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE);
return objSource;
}
public ITreeModelSource getTreeModelSource(){
ITreeModelSource objSource = (ITreeModelSource)getPage().getRequestCycle().getAttribute(ITreeModelSource.TREE_MODEL_SOURCE_ATTRIBUTE);
return objSource;
}
}