/*
* NAME
* $RCSfile$ -
* DESCRIPTION
* [given below in javadoc format]
* DELTA
* $Revision: 11553 $
* CREATED
* $Date: 2007-06-05 15:06:23 -0700 (星期二, 05 六月 2007) $ by birgit
* COPYRIGHT
* West Consulting bv
* TO DO
*
*/
package tablelayout;
import java.util.StringTokenizer;
// Parse Layout String
//=======================
// Parse a layout string, allocating and setting the values.
//
// A layout is a string of a location specification.
// Each location specification has the form:
//
// column row col_span row_span opt_list
//
// where the meaning of each field is:
//
// column Integer >= 0 descibing column in array
// row Row >= 0 describing row in array
//
// optional:
// col_span Integer >= 1 describing horizontal widget span
// row_span Integer >= 1 describing vertical widget span
// opt_list Series of characters each representing an option:
// l: TBL_LEFT
// r: TBL_RIGHT
// t: TBL_TOP
// b: TBL_BOTTOM
// w: TBL_LK_WIDTH
// h: TBL_LK_HEIGHT
// W: TBL_SM_WIDTH
// H: TBL_SM_HEIGHT
//
// The options are interpreted in the TableOpts() method.
//
/**
* This class parses the string which specifies the layout for a component.
*
* The layout string specifies the column, row, column span, row span,
* and options for each component. The options field is optional.
* The options are parsed by the TableOpts
* class.
*
* Components which are not named in the layout specification are
* positioned
* in column 0, row 0, with colum and row spans of 1, all the options will
* be
* <em>false</em>. If the layout is
* changed after the TableLocRec is created, then a complete
* re-layout is performed.
*
* Each layout specification is of the form:
* <pre>
* name col row [opts]
* </pre>
*
* @see tablelayout.TableLayout
* @see tablelayout.TableOpts
* @author Birgit Arkesteijn
* @version $Revision: 11553 $ $Date: 2007-06-05 15:06:23 -0700 (星期二, 05 六月 2007) $
*/
public class TableLocRec extends Object
{
private static final String version_id =
"@(#)$Id: TableLocRec.java 11553 2007-06-05 22:06:23Z duns $ Copyright West Consulting bv";
/**
* Position of column in table (>=0)
*/
public int col;
/**
* Position of row in table (>=0)
*/
public int row;
/**
* Horizontal widget span (>=1)
*/
public int col_span;
/**
* Vertical widget span (>=1)
*/
public int row_span;
/**
* Original width of the cell
*/
public int orig_width;
/**
* Original heigth of the cell
*/
public int orig_height;
/**
* The width of the cell, changed because of sameWidth constraint
*/
public int same_width;
/**
* The height of the cell, changed because of sameHeight constraint
*/
public int same_height;
/**
* Justify, grow and shrink constraint options
*
* @see tablelayout.TableOpts
*/
public TableOpts options;
static final String CHAR_BLANC = " ";
/**
*
*/
public TableLocRec()
{
col = 0;
row = 0;
col_span = 1;
row_span = 1;
orig_width = 0;
orig_height = 0;
same_width = 0;
same_height = 0;
options = new TableOpts();
}
/**
* @param layout the string that specifies the layout
*/
public TableLocRec(String layout)
{
String next;
orig_width = 0;
orig_height = 0;
same_width = 0;
same_height = 0;
StringTokenizer st = new StringTokenizer(layout, CHAR_BLANC, false);
next = st.nextToken();
col = Integer.valueOf(next).intValue();
next = st.nextToken();
row = Integer.valueOf(next).intValue();
// is there a next token?
try
{
next = st.nextToken();
}
catch (Exception e)
{
// No next token
col_span = 1;
row_span = 1;
options = new TableOpts ();
return;
}
// is the token a number (col_span) or not (option)
try
{
col_span = Integer.valueOf(next).intValue();
if (col_span < 1) col_span = 1;
}
catch (NumberFormatException e)
{
col_span = 1;
row_span = 1;
options = new TableOpts (next);
return;
}
// is there a next token?
try
{
next = st.nextToken();
}
catch (Exception e)
{
// No next token
row_span = 1;
options = new TableOpts ();
return;
}
// is the token a number (row_span) or not (option)
try
{
row_span = Integer.valueOf(next).intValue();
if (row_span < 1) row_span = 1;
}
catch (NumberFormatException e)
{
row_span = 1;
options = new TableOpts (next);
return;
}
try
{
next = st.nextToken();
options = new TableOpts (next);
}
catch (Exception e)
{
options = new TableOpts ();
}
}
/**
* Creates a clone of the object. A new instance is allocated and all
* the variables of the class are cloned
*/
public Object clone()
{
TableLocRec elem = new TableLocRec();
elem.options = options;
elem.col = col;
elem.row = row;
elem.col_span = col_span;
elem.row_span = row_span;
elem.orig_width = orig_width;
elem.orig_height = orig_height;
elem.same_width = same_width;
elem.same_height = same_height;
return ((Object) elem);
}
/**
* Returns the String representation
*/
public String toString()
{
return (
"TableLocRec [" +
"\n\tcol " + col +
" row " + row +
" col_span " + col_span +
" row_span " + row_span +
"\n\torig_width " + orig_width +
" orig_height " + orig_height +
" same_width " + same_width +
" same_height " + same_height +
"\n\toptions " + options.toString() +
"]");
}
// Used by qsort when the layout table is sorted by span
// before doing distribution of space to rows or columns.
//
/**
* Compaires the span width of two columns, returns the difference in
* span width
*
* @param loc1 the first column
* @param loc2 the second column
*/
public static int compareColSpan(TableLocRec loc1, TableLocRec loc2)
{
if (loc1.col_span == loc2.col_span)
return loc1.col - loc2.col;
return loc1.col_span - loc2.col_span;
}
/**
* Compaires the span height of two rows, returns the difference in
* span height
*
* @param loc1 the first row
* @param loc2 the second row
*/
public static int compareRowSpan (TableLocRec loc1, TableLocRec loc2)
{
if (loc1.row_span == loc2.row_span)
return loc1.row - loc2.row;
return loc1.row_span - loc2.row_span;
}
/**
* Returns the preferred width of the layout component
*/
public int preferredWidth ()
{
// First take care of situations where SameSize resources apply
if (same_width != 0)
{
return same_width;
}
else
{
return orig_width;
}
}
/**
* Returns the preferred heigth of the layout component
*/
public int preferredHeight ()
{
if (same_height != 0)
{
return same_height;
}
else
{
return orig_height;
}
}
}