blob: 9351bcf0c6dba575c84ebcc9df042953bd86c6e7 [file] [log] [blame]
// Copyright 2004, 2005 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.table;
import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.contrib.table.model.ITableColumn;
import org.apache.tapestry.contrib.table.model.ITableModel;
import org.apache.tapestry.contrib.table.model.ITableSessionStateManager;
import org.apache.tapestry.contrib.table.model.simple.SimpleListTableDataModel;
import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumnModel;
import org.apache.tapestry.contrib.table.model.simple.SimpleTableModel;
import org.apache.tapestry.contrib.table.model.simple.SimpleTableSessionStateManager;
import org.apache.tapestry.contrib.tree.model.*;
import org.apache.tapestry.event.PageDetachListener;
import org.apache.tapestry.event.PageEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
*/
public abstract class TreeTableDataView extends BaseComponent implements
ITreeRowSource, PageDetachListener
{
private int m_nTreeDeep = -1;
private TreeRowObject m_objTreeRowObject = null;
private ArrayList m_arrAllExpandedNodes = null;
public TreeTableDataView()
{
super();
initialize();
}
public void initialize()
{
m_nTreeDeep = -1;
// m_objTableModel = null;
m_objTreeRowObject = null;
m_arrAllExpandedNodes = null;
}
/**
* @see org.apache.tapestry.event.PageDetachListener#pageDetached(org.apache.tapestry.event.PageEvent)
*/
public void pageDetached(PageEvent event)
{
initialize();
}
public abstract ITreeModelSource getTreeViewParameter();
public ITreeModelSource getTreeModelSource()
{
ITreeModelSource objSource = (ITreeModelSource) getPage()
.getRequestCycle().getAttribute(
ITreeModelSource.TREE_MODEL_SOURCE_ATTRIBUTE);
return objSource == null ? getTreeViewParameter() : objSource;
}
public List generateNodeList()
{
if (m_arrAllExpandedNodes == null)
{
ArrayList arrAllExpandedNodes = new ArrayList();
// render data
ITreeModelSource objTreeModelSource = getTreeModelSource();
ITreeModel objTreeModel = objTreeModelSource.getTreeModel();
ITreeDataModel objTreeDataModel = objTreeModel.getTreeDataModel();
Object objRoot = objTreeDataModel.getRoot();
Object objRootUID = objTreeDataModel.getUniqueKey(objRoot, null);
if (getShowRootNode())
{
walkTree(arrAllExpandedNodes, objRoot, objRootUID, 0,
objTreeModel, TreeRowObject.FIRST_LAST_ROW, new int[0],
true);
}
else
{
int nChildenCount = objTreeModel.getTreeDataModel()
.getChildCount(objRoot);
int nRowPossiotionType = nChildenCount == 1 ? TreeRowObject.FIRST_LAST_ROW
: TreeRowObject.FIRST_ROW;
boolean bFirst = true;
for(Iterator iter = objTreeModel.getTreeDataModel()
.getChildren(objRoot); iter.hasNext();)
{
Object objChild = iter.next();
Object objChildUID = objTreeModel.getTreeDataModel()
.getUniqueKey(objChild, objRoot);
boolean bChildLast = !iter.hasNext();
if (!bFirst)
{
if (bChildLast)
nRowPossiotionType = TreeRowObject.LAST_ROW;
else nRowPossiotionType = TreeRowObject.MIDDLE_ROW;
}
walkTree(arrAllExpandedNodes, objChild, objChildUID, 0,
objTreeModel, nRowPossiotionType, new int[0],
bChildLast);
bFirst = false;
}
}
m_arrAllExpandedNodes = arrAllExpandedNodes;
}
return m_arrAllExpandedNodes;
}
public void walkTree(ArrayList arrAllExpandedNodes, Object objParent,
Object objParentUID, int nDepth, ITreeModel objTreeModel,
int nRowPossiotionType, int[] arrConnectImages, boolean bLast)
{
int rowPositionType = nRowPossiotionType;
m_nTreeDeep = nDepth;
int nNumberOfChildren = objTreeModel.getTreeDataModel().getChildCount(
objParent);
boolean bLeaf = (nNumberOfChildren == 0) ? true : false;
TreeRowObject objTreeRowObject = new TreeRowObject(objParent,
objParentUID, nDepth, bLeaf, rowPositionType,
arrConnectImages);
arrAllExpandedNodes.add(objTreeRowObject);
boolean bContain = objTreeModel.getTreeStateModel()
.isUniqueKeyExpanded(objParentUID);
if (bContain)
{
int[] arrConnectImagesNew = new int[arrConnectImages.length + 1];
System.arraycopy(arrConnectImages, 0, arrConnectImagesNew, 0,
arrConnectImages.length);
if (bLast)
arrConnectImagesNew[arrConnectImagesNew.length - 1] = TreeRowObject.EMPTY_CONN_IMG;
else arrConnectImagesNew[arrConnectImagesNew.length - 1] = TreeRowObject.LINE_CONN_IMG;
Iterator colChildren = objTreeModel.getTreeDataModel().getChildren(
objParent);
for(Iterator iter = colChildren; iter.hasNext();)
{
Object objChild = iter.next();
Object objChildUID = objTreeModel.getTreeDataModel()
.getUniqueKey(objChild, objParentUID);
boolean bChildLast = !iter.hasNext();
if (bChildLast)
rowPositionType = TreeRowObject.LAST_ROW;
else rowPositionType = TreeRowObject.MIDDLE_ROW;
walkTree(arrAllExpandedNodes, objChild, objChildUID,
nDepth + 1, objTreeModel, rowPositionType,
arrConnectImagesNew, bChildLast);
}
}
}
/**
* Returns the treeDeep.
*
* @return int
*/
public int getTreeDeep()
{
return m_nTreeDeep;
}
/*
* public ITableModel getTableModel() { if(m_objTableModel == null){
* m_objTableModel = createTableModel(); } return m_objTableModel; }
*/
public ITableModel getTableModel()
{
return createTableModel();
}
private ITableModel createTableModel()
{
List arrAllNodes = generateNodeList();
Object[] arrAllExpandedNodes = new Object[arrAllNodes.size()];
arrAllNodes.toArray(arrAllExpandedNodes);
SimpleTableModel objTableModel = new SimpleTableModel(
arrAllExpandedNodes, getTableColunms());
objTableModel.getPagingState().setPageSize(getEntriesPerTablePage());
return objTableModel;
}
public ITableColumn[] getTableColunms()
{
ArrayList arrColumnsList = new ArrayList();
arrColumnsList.add(new TreeTableColumn("Name", false, null));
List arrTableColunms = getTableColumnsParameter();
if (arrTableColunms != null) arrColumnsList.addAll(arrTableColunms);
ITableColumn[] arrColumns = new ITableColumn[arrColumnsList.size()];
arrColumnsList.toArray(arrColumns);
return arrColumns;
}
public abstract List getTableColumnsParameter();
public abstract int getEntriesPerTablePage();
/**
* @see org.apache.tapestry.contrib.tree.model.ITreeRowSource#getTreeRow()
*/
public TreeRowObject getTreeRow()
{
return getTreeRowObject();
}
public ITableSessionStateManager getTableSessionStateManager()
{
SimpleListTableDataModel objDataModel = new SimpleListTableDataModel(
generateNodeList());
SimpleTableColumnModel objColumnModel = new SimpleTableColumnModel(
getTableColunms());
SimpleTableSessionStateManager objStateManager = new SimpleTableSessionStateManager(
objDataModel, objColumnModel);
return objStateManager;
// return NullTableSessionStateManager.NULL_STATE_MANAGER;
}
/**
* @see org.apache.tapestry.BaseComponent#renderComponent(org.apache.tapestry.IMarkupWriter,
* org.apache.tapestry.IRequestCycle)
*/
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
{
Object objExistedTreeModelSource = cycle
.getAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE);
cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, this);
super.renderComponent(writer, cycle);
cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE,
objExistedTreeModelSource);
}
/**
* @see org.apache.tapestry.AbstractComponent#renderBody(org.apache.tapestry.IMarkupWriter,
* org.apache.tapestry.IRequestCycle)
*/
public void renderBody(IMarkupWriter writer, IRequestCycle cycle)
{
Object objExistedTreeModelSource = cycle
.getAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE);
cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE, this);
super.renderBody(writer, cycle);
cycle.setAttribute(ITreeRowSource.TREE_ROW_SOURCE_ATTRIBUTE,
objExistedTreeModelSource);
}
public TreeRowObject getTreeRowObject()
{
return m_objTreeRowObject;
}
public void setTreeRowObject(TreeRowObject object)
{
m_objTreeRowObject = object;
}
public abstract boolean getShowRootNode();
}