package com.AsamiOffice.jaba2.awt;
import java.awt.LayoutManager2;
import java.awt.Component;
import java.awt.Container;
import java.awt.Point;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Insets;
import com.AsamiOffice.jaba2.util.Debug;
/**
* RowLayout
*
* @since Apr. 13, 1998
* @version Jun. 24, 1998
* @author ASAMI, Tomoharu (tasami@ibm.net)
*/
public class RowLayout extends AbstractLayoutManager {
/**
* policy
*
* HBASE
* HBASE_LEFT
* HBASE_CENTER
* HBASE_RIGHT
* HBASE_FILL
* VBASE
* VBASE_TOP
* VBASE_CENTER
* VBASE_BOTTOM
* VBASE_FILL
* HALIGN
* HALIGN_LEFT
* HALIGN_CENTER
* HALIGN_RIGHT
* HALIGN_FILL
* VALIGN
* VALIGN_TOP
* VALIGN_CENTER
* VALIGN_BOTTOM
* VALIGN_FILL
* WIDTH
* WIDTH_PREFERRED
* WIDTH_EQUAL
* WIDTH_FILL
* WIDTH_RELATIVE
* WIDTH_ABSOLUTE
* HEIGHT
* HEIGHT_PREFERRED
* HEIGHT_EQUAL
* HEIGHT_FILL
* HEIGHT_RELATIVE
* HEIGHT_ABSOLUTE
* RESIZE
* RESIZE_NONE
* RESIZE_WIDTH
* RESIZE_HEIGHT
* RESIZE_BOUND
*/
// HBASE
private static final int HBASE_MASK = 0x0000000f;
public static final int HBASE_DEFAULT = 0x00000000;
public static final int HBASE_LEFT = 0x00000001;
public static final int HBASE_CENTER = 0x00000002; // default
public static final int HBASE_RIGHT = 0x00000003;
public static final int HBASE_FILL = 0x00000004;
// VBASE
private static final int VBASE_MASK = 0x000000f0;
public static final int VBASE_DEFAULT = 0x00000000;
public static final int VBASE_TOP = 0x00000010;
public static final int VBASE_CENTER = 0x00000020; // default
public static final int VBASE_BOTTOM = 0x00000030;
public static final int VBASE_FILL = 0x00000040;
// HALIGN
private static final int HALIGN_MASK = 0x0000f00;
public static final int HALIGN_DEFAULT = 0x00000000;
public static final int HALIGN_LEFT = 0x00000100;
public static final int HALIGN_CENTER = 0x00000200; // default
public static final int HALIGN_RIGHT = 0x00000300;
public static final int HALIGN_FILL = 0x00000400;
// VALIGN
private static final int VALIGN_MASK = 0x0000f000;
public static final int VALIGN_DEFAULT = 0x00000000;
public static final int VALIGN_TOP = 0x00001000;
public static final int VALIGN_CENTER = 0x00002000; // default
public static final int VALIGN_BOTTOM = 0x00003000;
public static final int VALIGN_FILL = 0x00004000;
// WIDTH
private static final int WIDTH_MASK = 0x000f0000;
public static final int WIDTH_DEFAULT = 0x00000000;
public static final int WIDTH_PREFERRED = 0x00010000; // default
public static final int WIDTH_EQUAL = 0x00020000;
public static final int WIDTH_FILL = 0x00030000;
public static final int WIDTH_RELATIVE = 0x00040000; // use attr
public static final int WIDTH_ABSOLUTE = 0x00050000; // use attr
// HEIGHT
private static final int HEIGHT_MASK = 0x00f00000;
public static final int HEIGHT_DEFAULT = 0x00000000;
public static final int HEIGHT_PREFERRED = 0x00100000;
public static final int HEIGHT_EQUAL = 0x00200000; // default
public static final int HEIGHT_FILL = 0x00300000;
public static final int HEIGHT_RELATIVE = 0x00400000; // use attr
public static final int HEIGHT_ABSOLUTE = 0x00500000; // use attr
// RESIZE
private static final int RESIZE_MASK = 0x0f000000;
public static final int RESIZE_DEFAULT = 0x00000000;
public static final int RESIZE_NONE = 0x01000000;
public static final int RESIZE_WIDTH = 0x02000000;
public static final int RESIZE_HEIGHT = 0x03000000; // default
public static final int RESIZE_BOUND = 0x04000000;
protected int hbasePolicy_;
protected int vbasePolicy_;
protected int halignPolicy_;
protected int valignPolicy_;
protected int widthPolicy_;
protected int heightPolicy_;
protected int resizePolicy_;
public RowLayout() {
this(
HBASE_DEFAULT |
VBASE_DEFAULT |
HALIGN_DEFAULT |
VALIGN_DEFAULT |
WIDTH_DEFAULT |
HEIGHT_DEFAULT |
RESIZE_DEFAULT
);
}
public RowLayout(int policy) {
this(policy, 5, 5);
}
public RowLayout(int policy, int hgap, int vgap) {
super(hgap, vgap);
hbasePolicy_ = policy & HBASE_MASK;
if (hbasePolicy_ == HBASE_DEFAULT) {
hbasePolicy_ = HBASE_CENTER;
}
vbasePolicy_ = policy & VBASE_MASK;
if (vbasePolicy_ == VBASE_DEFAULT) {
vbasePolicy_ = VBASE_CENTER;
}
halignPolicy_ = policy & HALIGN_MASK;
if (halignPolicy_ == HALIGN_DEFAULT) {
halignPolicy_ = HALIGN_CENTER;
}
valignPolicy_ = policy & VALIGN_MASK;
if (valignPolicy_ == VALIGN_DEFAULT) {
valignPolicy_ = VALIGN_CENTER;
}
widthPolicy_ = policy & WIDTH_MASK;
if (widthPolicy_ == WIDTH_DEFAULT) {
widthPolicy_ = WIDTH_EQUAL;
}
heightPolicy_ = policy & HEIGHT_MASK;
if (heightPolicy_ == HEIGHT_DEFAULT) {
heightPolicy_ = HEIGHT_PREFERRED;
}
resizePolicy_ = policy & RESIZE_MASK;
if (resizePolicy_ == RESIZE_DEFAULT) {
resizePolicy_ = RESIZE_WIDTH;
}
if (!((hbasePolicy_ == HBASE_LEFT ||
hbasePolicy_ == HBASE_CENTER ||
hbasePolicy_ == HBASE_RIGHT ||
hbasePolicy_ == HBASE_FILL) &&
(vbasePolicy_ == VBASE_TOP ||
vbasePolicy_ == VBASE_CENTER ||
vbasePolicy_ == VBASE_BOTTOM ||
vbasePolicy_ == VBASE_FILL) &&
(halignPolicy_ == HALIGN_LEFT ||
halignPolicy_ == HALIGN_CENTER ||
halignPolicy_ == HALIGN_RIGHT ||
halignPolicy_ == HALIGN_FILL) &&
(valignPolicy_ == VALIGN_TOP ||
valignPolicy_ == VALIGN_CENTER ||
valignPolicy_ == VALIGN_BOTTOM ||
valignPolicy_ == VALIGN_FILL) &&
(widthPolicy_ == WIDTH_PREFERRED ||
widthPolicy_ == WIDTH_EQUAL ||
widthPolicy_ == WIDTH_FILL ||
widthPolicy_ == WIDTH_RELATIVE ||
widthPolicy_ == WIDTH_ABSOLUTE) &&
(heightPolicy_ == HEIGHT_PREFERRED ||
heightPolicy_ == HEIGHT_EQUAL) &&
(resizePolicy_ == RESIZE_NONE ||
resizePolicy_ == RESIZE_WIDTH ||
resizePolicy_ == RESIZE_HEIGHT ||
resizePolicy_ == RESIZE_BOUND))) {
throw (new IllegalArgumentException("policy : " + policy));
}
}
public Dimension preferredLayoutSize(Container target) {
LayoutManagerHelper lmh = new LayoutManagerHelper(target);
lmh.setup();
Insets insets = lmh.insets;
int nComps = lmh.nComps;
Dimension maxSize = lmh.maxPref;
Dimension totalSize = lmh.totalPrefs;
// calculates the height
int height;
switch (heightPolicy_) {
case HEIGHT_PREFERRED:
height = totalSize.height;
break;
case HEIGHT_EQUAL:
height = nComps * maxSize.height;
break;
case HEIGHT_RELATIVE:
case HEIGHT_ABSOLUTE:
default:
throw (new InternalError
("Invalid heightPolicy_ : " + heightPolicy_));
}
height += _getVInnerGaps(nComps) + _getTopBottomGaps(insets);
// calculates the height
int width = maxSize.width + _getLeftRightGaps(insets);
Dimension result = new Dimension(width, height);
Debug.log(2, this, "preferredSize = " + result);
return (result);
}
public Dimension minimumLayoutSize(Container target) {
LayoutManagerHelper lmh = new LayoutManagerHelper(target);
lmh.setup();
Insets insets = lmh.insets;
int width = lmh.maxMin.width;
int height = lmh.totalMins.height;
return (new Dimension(
_getLeftRightGaps(insets) + width,
_getTopBottomGaps(insets) + height
));
}
public void layoutContainer(Container target) {
LayoutManagerHelper lmh = new LayoutManagerHelper(target);
lmh.setup();
if (lmh.size.width == 0 || lmh.size.height == 0 || lmh.nComps == 0) {
return;
}
Insets insets = lmh.insets;
Component[] comps = lmh.comps;
int nComps = lmh.nComps;
Dimension maxSize = lmh.maxPref;
Dimension totalSize = lmh.totalPrefs;
Rectangle[] areas = new Rectangle[nComps];
for (int i = 0;i < nComps;i++) {
areas[i] = new Rectangle(0, 0, 0, 0);
}
Debug.log(3, this, "components : " + Debug.a2s(comps));
Debug.log(3, this, "after initialize : " + Debug.a2s(areas));
// calc area heights and relative y positions
switch (heightPolicy_) {
case HEIGHT_PREFERRED: {
int y = 0;
for (int i = 0;i < nComps;i++) {
areas[i].y = y;
areas[i].height = lmh.prefs[i].height;
y += areas[i].height + hInnerGap_;
}
break;
}
case HEIGHT_EQUAL: {
int y = 0;
for (int i = 0;i < nComps;i++) {
areas[i].y = y;
areas[i].height = maxSize.height;
y += areas[i].height + hInnerGap_;
}
break;
}
case HEIGHT_RELATIVE:
case HEIGHT_ABSOLUTE:
default:
throw (new InternalError
("Invalid height policy : " + heightPolicy_));
}
Debug.log(
3,
this,
"after relative y position and height : " + Debug.a2s(areas)
);
// calc area widths
switch (widthPolicy_) {
case WIDTH_PREFERRED:
for (int i = 0;i < nComps;i++) {
areas[i].width = lmh.prefs[i].width;
}
break;
case WIDTH_EQUAL:
for (int i = 0;i < nComps;i++) {
areas[i].width = maxSize.width;
}
break;
case WIDTH_FILL:
for (int i = 0;i < nComps;i++) {
areas[i].width = lmh.size.width - _getLeftRightGaps(insets); // XXX : viewWidth
}
break;
default:
throw (new InternalError
("Invalid width policy : " + widthPolicy_));
}
Debug.log(3, this, "after widths : " + Debug.a2s(areas));
// calc absolute y positons
Rectangle last = areas[areas.length - 1];
int compsHeight = last.y + last.height;
switch (vbasePolicy_) {
case VBASE_TOP: {
int y = _getTopGap(insets);
for (int i = 0;i < nComps;i++) {
areas[i].translate(0, y);
}
break;
}
case VBASE_CENTER: {
int viewHeight = lmh.size.height - _getTopBottomGaps(insets);
int y;
if (viewHeight > compsHeight) {
y = _getTopGap(insets) + (viewHeight / 2) - (compsHeight / 2);
} else {
y = _getTopGap(insets);
}
for (int i = 0;i < nComps;i++) {
areas[i].translate(0, y);
}
break;
}
case VBASE_BOTTOM: {
int viewHeight = lmh.size.height - _getTopBottomGaps(insets);
int y;
if (viewHeight > compsHeight) {
y = _getTopGap(insets) + viewHeight - compsHeight;
} else {
y = _getTopGap(insets);
}
for (int i = 0;i < nComps;i++) {
areas[i].translate(0, y);
}
break;
}
case VBASE_FILL:
default:
throw (new InternalError
("Invalid vbase policy : " + vbasePolicy_));
}
Debug.log(3, this, "after absolute y position : " + Debug.a2s(areas));
// calc absolute x positions
int viewWidth = lmh.size.width - _getLeftRightGaps(insets);
switch (hbasePolicy_) {
case HBASE_LEFT:
for (int i = 0;i < nComps;i++) {
areas[i].x = _getLeftGap(insets);
}
break;
case HBASE_CENTER: {
int left = _getLeftGap(insets);
for (int i = 0;i < nComps;i++) {
areas[i].x = left + (viewWidth / 2) - (areas[i].width / 2);
}
break;
}
case HBASE_RIGHT: {
int left = _getLeftGap(insets);
for (int i = 0;i < nComps;i++) {
areas[i].x = left + viewWidth - areas[i].width;
}
break;
}
case HBASE_FILL:
break;
default:
throw (new InternalError
("Invalid base policy : " + hbasePolicy_));
}
Debug.log(3, this, "after absolute x position : " + Debug.a2s(areas));
// calc resize
switch (resizePolicy_) {
case RESIZE_NONE:
for (int i = 0;i < nComps;i++) {
Dimension size = lmh.prefs[i];
Point point = UAWT.calcPointToDrawCenter(areas[i], size);
areas[i].x = point.x;
areas[i].y = point.y;
}
break;
case RESIZE_WIDTH:
for (int i = 0;i < nComps;i++) {
Dimension size = lmh.prefs[i];
Point point = UAWT.calcPointToDrawCenter(areas[i], size);
areas[i].height = size.height;
areas[i].y = point.y;
}
break;
case RESIZE_HEIGHT:
for (int i = 0;i < nComps;i++) {
Dimension size = lmh.prefs[i];
Point point = UAWT.calcPointToDrawCenter(areas[i], size);
areas[i].x = point.x;
areas[i].width = size.width;
}
break;
case RESIZE_BOUND:
// do nothing
break;
default:
throw (new InternalError
("Bad resizePolicy_ : " + resizePolicy_));
}
Debug.log(3, this, "after calculation : " + Debug.a2s(areas));
// do move
_moveComponents(comps, areas);
}
}