|
TablePeer |
|
/* ** Luxor - XML User Interface Language (XUL) Toolkit ** Copyright (c) 2001, 2002 by Gerald Bauer ** ** This program is free software. ** ** You may redistribute it and/or modify it under the terms of the GNU ** General Public License as published by the Free Software Foundation. ** Version 2 of the license should be included with this distribution in ** the file LICENSE, as well as License.html. If the license is not ** included with this distribution, you may find a copy at the FSF web ** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the ** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. ** ** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, ** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR ** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY ** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR ** REDISTRIBUTION OF THIS SOFTWARE. ** */ package luxor.swing; import java.awt.Component; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.*; import javax.swing.*; import luxor.core.*; import luxor.core.table.*; import luxor.spi.*; import luxor.status.*; public class TablePeer extends AbstractContainer { static Logger T = Logger.getLogger( TablePeer.class ); private JPanel _panel; public TablePeer( TableDef def, JComponentResolver resolver ) { super( def ); _panel = new JPanel(); _panel.setLayout( new GridBagLayout() ); // todo: read width attribute Iterator rowIt = def.getRowDefs().iterator(); int y = 0; while( rowIt.hasNext() ) { TableRowDef row = ( TableRowDef ) rowIt.next(); Iterator dataIt = row.getDataDefs().iterator(); int x = 0; while( dataIt.hasNext() ) { TableDataDef cell = ( TableDataDef ) dataIt.next(); int colspan = setupCell( cell, _panel, x, y, resolver ); x += colspan; } y++; } resolveReferences(); } private int setupCell( TableDataDef def, JPanel panel, int x, int y, JComponentResolver resolver ) { int colspan = def.getColSpan(); int rowspan = def.getRowSpan(); // possible values: // horz = MAX, LEFT, CENTER, RIGHT // vert = MAX, TOP, MIDDLE, BOTTOM - should i rename middle to center?? int horz = def.getAlignAttribute( Xul.Attribute.HORZ, Xul.Align.LEFT ); int vert = def.getAlignAttribute( Xul.Attribute.VERT, Xul.Align.MIDDLE ); GridBagConstraints con = new GridBagConstraints(); con.gridx = x; con.gridy = y; con.weightx = 0; con.weighty = 0; if( horz == Xul.Align.MAX && vert == Xul.Align.MAX ) { con.fill = GridBagConstraints.BOTH; con.weightx = 1.0; con.weighty = 1.0; horz = Xul.Align.CENTER; vert = Xul.Align.MIDDLE; } else if( horz == Xul.Align.MAX ) { con.fill = GridBagConstraints.HORIZONTAL; con.weightx = 1.0; horz = Xul.Align.CENTER; } else if( vert == Xul.Align.MAX ) { con.fill = GridBagConstraints.VERTICAL; con.weighty = 1.0; vert = Xul.Align.MIDDLE; } else { con.fill = GridBagConstraints.NONE; } if( horz == Xul.Align.LEFT && vert == Xul.Align.TOP ) { con.anchor = GridBagConstraints.NORTHWEST; } else if( horz == Xul.Align.LEFT && vert == Xul.Align.MIDDLE ) { con.anchor = GridBagConstraints.WEST; } else if( horz == Xul.Align.LEFT && vert == Xul.Align.BOTTOM ) { con.anchor = GridBagConstraints.SOUTHWEST; } else if( horz == Xul.Align.CENTER && vert == Xul.Align.TOP ) { con.anchor = GridBagConstraints.NORTH; } else if( horz == Xul.Align.CENTER && vert == Xul.Align.MIDDLE ) { con.anchor = GridBagConstraints.CENTER; } else if( horz == Xul.Align.CENTER && vert == Xul.Align.BOTTOM ) { con.anchor = GridBagConstraints.SOUTH; } else if( horz == Xul.Align.RIGHT && vert == Xul.Align.TOP ) { con.anchor = GridBagConstraints.NORTHEAST; } else if( horz == Xul.Align.RIGHT && vert == Xul.Align.MIDDLE ) { con.anchor = GridBagConstraints.EAST; } else if( horz == Xul.Align.RIGHT && vert == Xul.Align.BOTTOM ) { con.anchor = GridBagConstraints.SOUTHEAST; } else { Xul.error( "unsupported horz/vert combination" ); T.debug( " horz=" + horz ); T.debug( " vert=" + vert ); } con.gridwidth = colspan; con.gridheight = rowspan; JComponent jcomp; List compDefs = def.getComponentDefs(); if( compDefs.size() == 0 ) { jcomp = new JLabel( "" ); } else if( compDefs.size() == 1 ) { NComponentFactory f = ( NComponentFactory ) compDefs.get( 0 ); NComponent comp = f.createNComponent( resolver ); addComponent( comp ); jcomp = comp.getJComponent(); } else { // squeeze components into a panel JPanel cell = new JPanel(); cell.setLayout( new FlowLayout( FlowLayout.LEFT ) ); Iterator compDefIt = compDefs.iterator(); while( compDefIt.hasNext() ) { NComponentFactory f = ( NComponentFactory ) compDefIt.next(); NComponent comp = f.createNComponent( resolver ); addComponent( comp ); cell.add( comp.getJComponent() ); } jcomp = cell; } panel.add( jcomp, con ); return colspan; } public JComponent getJComponent() { return _panel; } public boolean useMinHeight() { return false; } public boolean useMinWidth() { return false; } }
|
TablePeer |
|