package org.droiddraw.widget;
import java.util.Vector;
import org.droiddraw.property.StringProperty;
public class TableRow extends LinearLayout {
Vector<Integer> widths;
public TableRow() {
this.tagName = "TableRow";
this.orientation.setStringValue("horizontal");
this.orientation.setEditable(false);
this.widthProp.setStringValue("fill_parent");
this.widthProp.setEditable(false);
apply();
}
@Override
public void positionWidget(Widget w) {
super.positionWidget(w);
if (parent instanceof TableLayout)
parent.positionWidget(this);
}
@Override
protected void repositionAllWidgetsInternal() {
int y = 0;
int x = 0;
Vector<Widget> with_weight = new Vector<Widget>();
int max_base = 0;
for (Widget w : widgets) {
if (!vertical) {
if (! (w instanceof Layout) && w.getBaseline() > max_base) {
max_base = w.getBaseline();
}
}
StringProperty prop = (StringProperty)w.getPropertyByAttName("android:layout_weight");
if (prop != null && "1".equals(prop.getStringValue()))
with_weight.add(w);
if (vertical)
y +=w.getPadding(TOP)+w.getHeight()+w.getPadding(BOTTOM);
else
x += w.getPadding(LEFT)+w.getWidth()+w.getPadding(RIGHT);
}
if (with_weight.size() > 0) {
if (vertical) {
int extra = getHeight()-y;
share = extra/with_weight.size();
}
else {
int extra = getWidth()-x;
share = extra/with_weight.size();
}
}
y=0;
x=0;
for (Widget w : widgets) {
StringProperty prop = (StringProperty)w.getPropertyByAttName("android:layout_column");
if (prop != null && widths != null) {
int col = (Integer.parseInt(prop.getStringValue()));
int ix = widgets.indexOf(w);
while (ix < col) {
x+=widths.get(ix++);
}
}
String gravity = "left";
prop = (StringProperty)w.getPropertyByAttName("android:layout_gravity");
if (prop != null)
gravity = prop.getStringValue();
if (vertical) {
int width_w_pad = (w.getPadding(Widget.LEFT)+w.getWidth()+w.getPadding(Widget.RIGHT));
if ("right".equals(gravity))
x = getWidth()-width_w_pad;
else if ("center_horizontal".equals(gravity) || "center".equals(gravity))
x = getWidth()/2-width_w_pad/2;
else
x = w.getPadding(Widget.LEFT);
}
else {
int height_w_pad = (w.getPadding(Widget.TOP)+w.getHeight()+w.getPadding(Widget.BOTTOM));
if ("bottom".equals(gravity))
y = getHeight()-height_w_pad;
else if ("center_vertical".equals(gravity) || "center".equals(gravity))
y = (getHeight()-height_w_pad)/2;
else {
if (w instanceof Layout) {
y = w.getPadding(Widget.TOP);
}
else {
y = max_base-w.getBaseline()+w.getPadding(TOP);
}
}
}
if (vertical) {
y+=w.getPadding(Widget.TOP);
}
else {
x+=w.getPadding(Widget.LEFT);
}
w.setPosition(x, y);
if (vertical) {
y+=w.getHeight()+w.getPadding(Widget.BOTTOM);
}
else {
x+=w.getWidth()+w.getPadding(Widget.RIGHT);
}
}
}
public void setWidths(Vector<Integer> widths) {
int ix = 0;
for (Widget w : widgets) {
StringProperty prop = (StringProperty)w.getPropertyByAttName("android:layout_column");
if (prop != null) {
ix = (Integer.parseInt(prop.getStringValue()));
}
prop = (StringProperty)w.getPropertyByAttName("android:layout_span");
int wd = widths.get(ix++);
if (prop != null) {
int span = (Integer.parseInt(prop.getStringValue()));
for (int i=1;i<span;i++) {
wd+=widths.get(ix++);
}
}
w.setSizeInternal(wd-w.getPadding(LEFT)-w.getPadding(RIGHT), w.getHeight());
}
this.widths = widths;
repositionAllWidgetsInternal();
}
@Override
public int getContentWidth() {
if (widths != null && widths.size() > 0) {
int res = 0;
for (int w : widths) {
res += w;
}
return res;
}
return super.getContentWidth();
}
@Override
public void addEditableProperties(Widget w) {
w.addProperty(new StringProperty("Column Span", "android:layout_span", "1"));
super.addEditableProperties(w);
}
@Override
public void removeEditableProperties(Widget w) {
w.removeProperty(new StringProperty("Column Span", "android:layout_span", "1"));
super.removeEditableProperties(w);
}
}