001// Copyright 2004, 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry.contrib.table.components;
016
017import java.util.ArrayList;
018import java.util.List;
019import java.util.StringTokenizer;
020
021import org.apache.hivemind.ApplicationRuntimeException;
022import org.apache.tapestry.IComponent;
023import org.apache.tapestry.contrib.table.model.IAdvancedTableColumn;
024import org.apache.tapestry.contrib.table.model.IAdvancedTableColumnSource;
025import org.apache.tapestry.contrib.table.model.ITableColumn;
026import org.apache.tapestry.contrib.table.model.ITableColumnModel;
027import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumn;
028import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumnModel;
029import org.apache.tapestry.services.ExpressionEvaluator;
030
031/**
032 * A placeholder for a static methods related to the Table component
033 * 
034 * @since 3.0
035 * @author Mindbridge
036 */
037public class TableColumnModelSourceImpl implements TableColumnModelSource
038{
039    /** @since 4.0 */
040    private ExpressionEvaluator _expressionEvaluator;
041
042    /** @since 4.0 */
043
044    public void setExpressionEvaluator(ExpressionEvaluator expressionEvaluator)
045    {
046        _expressionEvaluator = expressionEvaluator;
047    }
048
049    /**
050     * Generate a table column model out of the description string provided. Entries in the
051     * description string are separated by commas. Each column entry is of the format name,
052     * name:expression, or name:displayName:expression. An entry prefixed with ! represents a
053     * non-sortable column. If the whole description string is prefixed with *, it represents
054     * columns to be included in a Form.
055     * 
056     * @param strDesc
057     *            the description of the column model to be generated
058     * @param objComponent
059     *            the component ordering the generation
060     * @param objColumnSettingsContainer
061     *            the component containing the column settings
062     * @return a table column model based on the provided parameters
063     */
064    public ITableColumnModel generateTableColumnModel(IAdvancedTableColumnSource objColumnSource,
065                String strDesc, IComponent objComponent, IComponent objColumnSettingsContainer)
066    {
067        if (strDesc == null)
068            return null;
069
070        List arrColumns = new ArrayList();
071
072        strDesc = strDesc.trim();
073        boolean bFormColumns = false;
074        while (strDesc.startsWith("*"))
075        {
076            strDesc = strDesc.substring(1);
077            bFormColumns = true;
078        }
079
080        StringTokenizer objTokenizer = new StringTokenizer(strDesc, ",");
081        while (objTokenizer.hasMoreTokens())
082        {
083            String strToken = objTokenizer.nextToken().trim();
084
085            if (strToken.startsWith("="))
086            {
087                String strColumnExpression = strToken.substring(1);
088
089                Object objColumn = _expressionEvaluator.read(
090                        objColumnSettingsContainer,
091                        strColumnExpression);
092
093                if (!(objColumn instanceof ITableColumn))
094                    throw new ApplicationRuntimeException(TableMessages.notAColumn(
095                            objComponent,
096                            strColumnExpression));
097
098                arrColumns.add(objColumn);
099                continue;
100            }
101
102            boolean bSortable = true;
103            if (strToken.startsWith("!"))
104            {
105                strToken = strToken.substring(1);
106                bSortable = false;
107            }
108
109            StringTokenizer objColumnTokenizer = new StringTokenizer(strToken, ":");
110
111            String strName = "";
112            if (objColumnTokenizer.hasMoreTokens())
113                strName = objColumnTokenizer.nextToken();
114
115            String strExpression = strName;
116            if (objColumnTokenizer.hasMoreTokens())
117                strExpression = objColumnTokenizer.nextToken();
118
119            String strDisplayName = strName;
120            if (objColumnTokenizer.hasMoreTokens())
121            {
122                strDisplayName = strExpression;
123                strExpression = objColumnTokenizer.nextToken();
124            }
125
126            IAdvancedTableColumn objColumn = 
127                objColumnSource.generateTableColumn(strName, strDisplayName,
128                                bSortable, strExpression);
129            if (bFormColumns)
130                objColumn.setColumnRendererSource(SimpleTableColumn.FORM_COLUMN_RENDERER_SOURCE);
131            if (objColumnSettingsContainer != null)
132                objColumn.loadSettings(objColumnSettingsContainer);
133
134            arrColumns.add(objColumn);
135        }
136
137        return new SimpleTableColumnModel(arrColumns);
138    }
139
140}