Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.myfaces.trinidad.model;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* The data model used by Trinidad Tree components. A TreeModel is
* responsible for understanding how to iterate through an
* object graph, enter and leave containers, and identify
* rows of objects within each container. Within any one
* container, a TreeModel looks just like a CollectionModel,
* which extends the JSF DataModel class. (So, to understand
* this class, start by learning how DataModel works).
*
*
Entering and exiting containers
*
* TreeModel extends CollectionModel to add support for container rows,
* which are entered and exited with enterContainer() and exitContainer()
* methods. Within a container, row indices (get/setRowIndex())
* are relative to the container. However, row keys - get/setRowKey(),
* from the CollectionModel API - are always global for the entire
* tree model, so it is sufficient to call setRowKey() to enter and
* exit all the needed parents.
*
*
Lazy loading of contents
*
* When a tree or treeTable iterates through the model,
* it will generally seek to see if a given node is a
* container - with the isContainer() method -
* and also see if the node is empty (and therefore
* not expandable) with the isContainerEmpty()
* method. The default implementation of that latter
* method involves entering the child and seeing how
* many children it has. As a result, by default,
* you will see one more level of content being
* requested than is actually visible on screen. To
* avoid this, provide a custom override of
* isContainerEmpty() to return a value
* without actually entering the container. It
* is acceptable for this method to return a "false negative" -
* to return false when there might actually not be any
* contents - if that is the most efficient approach possible.
*
* The ChildPropertyTreeModel class is a useful
* basic subclass, but largely requires that you have the
* entire object model fully loaded. If you require
* lazy loading, you'll likely need a custom implementation.
*
*
Further documentation
*
* Rows in the TreeModel may (recursively) contain other rows.
* To figure out if the current row is a container, call the
* {@link #isContainer} method.
* If a row is a container, use the {@link #enterContainer} method
* to access its child rows. Once the {@link #enterContainer} method is called
* all the CollectionModel API's methods (like {@link #getRowCount})
* operate on the child collection.
* To return back to the parent row, use the {@link #exitContainer} method.
*
* To point the tree to the root collection call:
* setRowKey(null).
* Now, getRowCount() returns 4.
* setRowIndex(1);getRowData() returns Root2.
* setRowKey("r4");getRowData() returns Root4.
*
* exitContainer(); // exit Folder2, Root1 is now the current row.
* setRowIndex(0);
* enterContainer(); // enter Folder1, getRowCount()==3
* setRowIndex(2);
* getRowData();
*
* Or, more simply:
*
* setRowKey("r1f1n3");
* getRowData();
*
*/
public abstract class TreeModel extends CollectionModel implements TreeLocalRowKeyIndex
{
/**
* Tests to see if the row identified by getRowData() is a container element.
* Use {@link #isContainerEmpty} to see if the current container element actually
* has children, or is an empty container.
* @return true if the current element may contain children.
*/
public abstract boolean isContainer();
/**
* Tests to see if the current container element actually has children.
* This could be more efficient than calling
* {@link #enterContainer} followed by {@link #getRowCount}.
* This method is permitted to return false even if the container is actually
* empty.
* This method should only be called if {@link #isContainer} returns true.
* @return true if the current container element has no children. If there
* is any doubt as to whether or not the container has children, this method
* should return false.
*/
public boolean isContainerEmpty()
{
if (!isContainer())
return true;
enterContainer();
try
{
int kids = getRowCount();
if (kids < 0)
{
setRowIndex(0);
return !isRowAvailable();
}
return (kids == 0);
}
finally
{
exitContainer();
}
}
/**
* This Collection changes to reflect the children of the current rowData,
* and the current rowData changes to be null.
* The current rowIndex becomes -1. This method should only be called
* if {@link #isContainer()} returns true.
* {@link #getRowCount} can be used to get the number of children.
*/
public abstract void enterContainer();
/**
* Pops back up to the parent collection.
* The current rowData becomes the rowData of the parent.
* This Collection will change to include the children of the new rowData.
*/
public abstract void exitContainer();
/**
* Gets the rowKey of the current row's container row.
* This implementation calls {@link #getContainerRowKey(Object)} with
* the current rowKey.
*/
public final Object getContainerRowKey()
{
Object key = getRowKey();
Object parentKey = getContainerRowKey(key);
return parentKey;
}
/**
* Gets the rowkey of each container, starting from the top most
* container, down to the container of the given child rowKey.
* The root container (which always has the null rowKey) is not included in
* this list. The given childRowKey is not included in this list.
*
* Calling getAllAncestorContainerRowKeys("r1f1n1")
* returns a List of two items:"r1" and "r1f1", in that order.
*
* @param childRowKey identifies the child row.
* @return An empty list is returned if the child row is a root row and
* has no parent containers. Each item in this list is a rowKey
* and is of type {@link Object}.
* The first rowKey (in this list) is the top most container. The last
* rowKey is the immediate container of the given childRowKey.
*/
public List