/* * Copyright 2000-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.jetspeed.portal.controllers; //ECS stuff import org.apache.ecs.html.Table; import org.apache.ecs.html.TD; import org.apache.ecs.html.TR; import org.apache.ecs.ConcreteElement; import org.apache.ecs.ElementContainer; //turbine RunData import org.apache.turbine.util.RunData; //jetspeed stuff import org.apache.jetspeed.portal.Portlet; import org.apache.jetspeed.portal.PortletConfig; import org.apache.jetspeed.portal.PortletControllerConfig; import org.apache.jetspeed.portal.PortletSet; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; //standard Java stuff import java.util.Vector; import java.util.StringTokenizer; import java.util.Enumeration; /** Layouts the portlets in a grid and apply the following constraints <ul> <li>all cells within the same column have the same width</li> <li>all cells within the same row have the same minimum height</li> </ul> <p>This controller expects the following parameters in its configuration file : <ul> <li><b>columns<b> optional, number of columns of the grid. If not specified, determined by the layout information in each portlet</li> <li><b>columnWidths</b> optional, the size of the columns, separated by a colon</li> <li><b>rows<b> optional, number of rows of the grid. If not specified, determined by the layout information in each portlet</li> <li><b>rowHeights</b> optional, the minimum size of the rows, separated by a colon</li> </ul> </p> <p>The controller expects each portlet to have a row number and a column number layout information. If this information is not found, put the Portlet in the first cell of the table</p> @author <a href="mailto:raphael@apache.org">Rapha謖 Luta</a> @version $Id: GridPortletController.java,v 1.17 2004/02/23 03:25:06 jford Exp $ */ public class GridPortletController extends AbstractPortletController { /** * Static initialization of the logger for this class */ private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(GridPortletController.class.getName()); private int columns = 0; private int rows = 0; private Vector rowHeights = null; private Vector colWidths = null; /** */ public GridPortletController() { rowHeights = new Vector(); colWidths = new Vector(); } /** */ private void calculateControllerLayout( Portlet portlet ) { if ( portlet instanceof PortletSet ) { Enumeration more = ((PortletSet)portlet).getPortlets(); while ( more.hasMoreElements() ) { calculateControllerLayout( (Portlet) more.nextElement() ); } return; } PortletConfig portletConf = portlet.getPortletConfig(); Integer colObj = portletConf.getConstraints().getColumn(); Integer rowObj = portletConf.getConstraints().getRow(); int col = (colObj!=null)?colObj.intValue():0; int row = (rowObj!=null)?rowObj.intValue():0; if ( col + 1 > this.getColumn() ) { this.setColumn( col + 1 ); } if ( row + 1 > this.getRow() ) { this.setRow( row + 1 ); } } /** Get the content for this PortletController */ public ConcreteElement getContent( RunData rundata ) { ElementContainer base = new ElementContainer(); try { PortletSet portlets = getPortlets(); PortletConfig pc = portlets.getPortletConfig(); // first get the number of columns and rows to display Enumeration en = portlets.getPortlets(); //see if any or the Portlets you want to add have a larger column or //row number than that defined in PSML while ( en.hasMoreElements() ) { Portlet portlet = (Portlet)en.nextElement(); calculateControllerLayout( portlet ); } setWidth( pc.getLayout( "width", getWidth() ) ); int rows = getRow(); int cols = getColumn(); if (0 == rows || 0 == cols) return base; // empty container Table t = new Table() .setWidth( this.getWidth() ) .setCellPadding( this.getPadding() ) .setAlign("center"); base.addElement( t ); ElementContainer[][] elements = new ElementContainer[rows][cols]; for( int i = 0; i < rows; i++ ) { for ( int j = 0 ; j < cols; j++ ) { elements[i][j]=new ElementContainer(); } } // populate the elements array en = portlets.getPortlets(); while (en.hasMoreElements() ) { Portlet p = (Portlet)en.nextElement(); PortletConfig pConf = p.getPortletConfig(); Integer colObj = pConf.getConstraints().getColumn(); Integer rowObj = pConf.getConstraints().getRow(); int colnum = (colObj!=null)?colObj.intValue():0; int rownum = (rowObj!=null)?rowObj.intValue():0; elements[rownum % rows][colnum % cols] .addElement( p.getContent( rundata ) ); } // build the table for (int i = 0; i < rows; ++i) { TR row = new TR(); TD td = null; for(int j=0; j < cols ; ++j) { row.addElement( td= new TD().setVAlign("top") .addElement( elements[i][j] ) ); if (getRowHeight(i)!=null) td.setHeight(getRowHeight(i)); if (getColumnWidth(j)!=null) td.setWidth(getColumnWidth(j)); } t.addElement(row); } } catch (Exception e) { logger.error("getContent():", e); } return base; } /** */ public void init() { super.init(); PortletControllerConfig conf = getConfig(); if (conf!=null) { setColumn(Integer.parseInt(conf.getInitParameter("column","0"))); setRow(Integer.parseInt(conf.getInitParameter("row","0"))); setColumnsWidth(parseList(conf.getInitParameter("columnWidths"))); setRowsHeight(parseList(conf.getInitParameter("rowHeights"))); } } /** Set the number of columns used in this controller */ public void setColumn(int col) { this.columns=col; } /** Get the number of columns used in this controller */ public int getColumn() { return this.columns; } /** Set the number of rows used by this controller */ public void setRow(int row) { this.rows=row; } /** Get the number of rows used by this controll */ public int getRow() { return this.rows; } /** */ public void setColumnsWidth(Vector widths) { this.colWidths = widths; } /** */ public Enumeration getColumnsWidth() { return colWidths.elements(); } /** */ public String getColumnWidth(int pos) { if (pos < colWidths.size()) return (String)colWidths.elementAt(pos); return null; } /** */ public void setRowsHeight(Vector heights) { this.rowHeights = heights; } /** */ public Enumeration getRowsHeight() { return rowHeights.elements(); } /** */ public String getRowHeight(int pos) { if (pos < rowHeights.size()) return (String)rowHeights.elementAt(pos); return null; } /** */ private Vector parseList(String list) { Vector v = new Vector(); if (list!=null) { StringTokenizer st = new StringTokenizer(list,","); while (st.hasMoreTokens()) v.addElement(st.nextToken()); } return v; } }