/*
* Concept profile generation tool suite
* Copyright (C) 2015 Biosemantics Group, Erasmus University Medical Center,
* Rotterdam, The Netherlands
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package org.erasmusmc.tablelayout;
import java.util.*;
/**
* The following inner class is used to bind components to their
* constraints.
*
* @author Daniel E. Barbalace
*/
public class TableLayoutConstraints implements TableLayoutConstants
{
/** Cell in which the upper left corner of the component lays */
public int col1, row1;
/** Cell in which the lower right corner of the component lays */
public int col2, row2;
/** Horizontal justification if component occupies just one cell */
public int hAlign;
/** Verical justification if component occupies just one cell */
public int vAlign;
/**
* Constructs an TableLayoutConstraints with the default settings. This
* constructor is equivalent to TableLayoutConstraints(0, 0, 0, 0, FULL, FULL).
*/
public TableLayoutConstraints ()
{
col1 = row1 = col2 = row2 = 0;
hAlign = vAlign = FULL;
}
/**
* Constructs an TableLayoutConstraints from a string.
*
* @param constraints indicates TableLayoutConstraints's position and justification
* as a string in the form "row, column" or
* "row, column, horizontal justification, vertical
* justification" or "row 1, column 1, row 2, column 2".
* It is also acceptable to delimit the paramters with
* spaces instead of commas.
*/
public TableLayoutConstraints (String constraints)
{
// Parse constraints using spaces or commas
StringTokenizer st = new StringTokenizer(constraints, ", ");
// Use default values for any parameter not specified or specified
// incorrectly. The default parameters place the component in a single
// cell at column 0, row 0. The component is fully justified.
col1 = 0;
row1 = 0;
col2 = 0;
row2 = 0;
hAlign = FULL;
vAlign = FULL;
String token = null;
try
{
// Get the first column (assume component is in only one column)
token = st.nextToken();
col1 = new Integer(token).intValue();
col2 = col1;
// Get the first row (assume component is in only one row)
token = st.nextToken();
row1 = new Integer(token).intValue();
row2 = row1;
// Get the second column
token = st.nextToken();
col2 = new Integer(token).intValue();
// Get the second row
token = st.nextToken();
row2 = new Integer(token).intValue();
}
catch (NoSuchElementException error) {}
catch (NumberFormatException error)
{
try
{
// Check if token means horizontally justification the component
if (token.equalsIgnoreCase("L"))
hAlign = LEFT;
else if (token.equalsIgnoreCase("C"))
hAlign = CENTER;
else if (token.equalsIgnoreCase("F"))
hAlign = FULL;
else if (token.equalsIgnoreCase("R"))
hAlign = RIGHT;
// There can be one more token for the vertical justification even
// if the horizontal justification is invalid
token = st.nextToken();
// Check if token means horizontally justification the component
if (token.equalsIgnoreCase("T"))
vAlign = TOP;
else if (token.equalsIgnoreCase("C"))
vAlign = CENTER;
else if (token.equalsIgnoreCase("F"))
vAlign = FULL;
else if (token.equalsIgnoreCase("B"))
vAlign = BOTTOM;
}
catch (NoSuchElementException error2) {}
}
// Make sure row2 >= row1
if (row2 < row1)
row2 = row1;
// Make sure col2 >= col1
if (col2 < col1)
col2 = col1;
}
/**
* Constructs an TableLayoutConstraints a set of constraints.
*
* @param col1 column where upper-left cornor of the component is placed
* @param row1 row where upper-left cornor of the component is placed
* @param col2 column where lower-right cornor of the component is placed
* @param row2 row where lower-right cornor of the component is placed
* @param hAlign horizontal justification of a component in a single cell
* @param vAlign vertical justification of a component in a single cell
*/
public TableLayoutConstraints
(int col1, int row1, int col2, int row2, int hAlign, int vAlign)
{
this.col1 = col1;
this.row1 = row1;
this.col2 = col2;
this.row2 = row2;
if ((hAlign < MIN_ALIGN) || (hAlign > MAX_ALIGN))
this.hAlign = FULL;
else
this.hAlign = hAlign;
if ((vAlign < MIN_ALIGN) || (vAlign > MAX_ALIGN))
this.vAlign = FULL;
else
this.vAlign = vAlign;
}
/**
* Gets a string representation of this TableLayoutConstraints.
*
* @return a string in the form "row 1, column 1, row 2, column 2" or
* "row, column, horizontal justification, vertical justification"
*/
public String toString ()
{
StringBuffer buffer = new StringBuffer();
buffer.append (row1);
buffer.append (", ");
buffer.append (col1);
buffer.append (", ");
if ((row1 == row2) && (col1 == col2))
{
final char h[] = {'L', 'C', 'F', 'R'};
final char v[] = {'T', 'C', 'F', 'B'};
buffer.append (h[hAlign]);
buffer.append (", ");
buffer.append (v[vAlign]);
}
else
{
buffer.append (row2);
buffer.append (", ");
buffer.append (col2);
}
return buffer.toString();
}
}