package com.csound.wizard.layout;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
public class LayoutParam {
public static final String
LAYOUT = "layout",
PADDING = "padding",
MARGIN = "margin",
FILL = "fill",
WRAP = "wrap",
// orientation
TOP = "top",
BOTTOM = "bottom",
CENTER = "center",
RIGHT = "right",
LEFT = "left",
CENTER_HORIZONTAL = "center-hor",
CENTER_VERTICAL = "center-ver";
private int[] margin = {0, 0, 0, 0};
private int[] padding = {0, 0, 0, 0};
private int width = 0;
private int height = 0;
private int gravity = Gravity.NO_GRAVITY;
private float weight = 0;
private Boolean
isSetMargin = false,
isSetPadding = false,
isSetLayout = false,
isSetGravity = false,
isSetWeight = false;
public static void set(JSONObject obj, View v) {
LayoutParam lp = new LayoutParam(obj);
lp.setLayout(v);
}
private LayoutParam(JSONObject obj) {
if (obj.containsKey(PADDING)) {
isSetPadding = decodeBorders(padding, obj.get(PADDING));
}
if (obj.containsKey(MARGIN)) {
isSetMargin = decodeBorders(margin, obj.get(MARGIN));
}
if (obj.containsKey(LAYOUT)) {
decodeLayout(obj.get(LAYOUT));
}
}
private void setLayout(View v) {
if (isSetPadding) {
v.setPadding(padding[0], padding[1], padding[2], padding[3]);
}
LinearLayout.LayoutParams lp;
if (isSetLayout) {
lp = new LinearLayout.LayoutParams(width, height);
} else {
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
}
if (isSetGravity) {
lp.gravity = gravity;
}
if (isSetWeight) {
lp.weight = weight;
}
if (isSetMargin) {
lp.setMargins(margin[0], margin[1], margin[2], margin[3]);
}
v.setLayoutParams(lp);
}
// ----------------------------------------------------------------
void decodeLayout(Object obj) {
if (Json.isArray(obj)) {
JSONArray arr = (JSONArray) obj;
if (arr.size() == 0) {
} else if (arr.size() == 1) {
int n = decodeLayoutParam(arr.get(0));
width = n;
height = n;
isSetLayout = true;
} else if (arr.size() == 2) {
width = decodeLayoutParam(arr.get(0));
height = decodeLayoutParam(arr.get(1));
isSetLayout = true;
} else if (arr.size() == 3 && Json.isNumber(arr.get(2))) {
width = decodeLayoutParam(arr.get(0));
height = decodeLayoutParam(arr.get(1));
weight = Json.getFloat(arr.get(2));
isSetLayout = true;
isSetWeight = true;
} else if (arr.size() > 3 && Json.isNumber(arr.get(2)) && Json.isString(arr.get(3))) {
width = decodeLayoutParam(arr.get(0));
height = decodeLayoutParam(arr.get(1));
weight = Json.getFloat(arr.get(2));
gravity = decodeGravity((String) arr.get(3));
isSetLayout = true;
isSetWeight = true;
isSetGravity = true;
}
} else {
int n = decodeLayoutParam(obj);
width = n;
height = n;
isSetLayout = true;
}
}
Boolean decodeBorders(int[] res, Object obj) {
if (Json.isNumber(obj)) {
int n = Json.getInt(obj);
for (int i = 0; i < 4; i++) {
res[i] = n;
}
return true;
} else if (Json.isArray(obj)) {
JSONArray arr = (JSONArray) obj;
if (arr.size() == 4
&& Json.isNumber(arr.get(0))
&& Json.isNumber(arr.get(1))
&& Json.isNumber(arr.get(2))
&& Json.isNumber(arr.get(3))) {
res[0] = Json.getInt(arr.get(0));
res[1] = Json.getInt(arr.get(1));
res[2] = Json.getInt(arr.get(2));
res[3] = Json.getInt(arr.get(3));
return true;
}
}
return false;
}
private static int decodeLayoutParam(Object obj) {
if (Json.isNumber(obj)) {
return Json.getInt(obj);
} else if (Json.isString(obj)) {
String s = (String) obj;
if (s.equals(FILL)) {
return LayoutParams.MATCH_PARENT;
} else if (s.equals(WRAP)) {
return LayoutParams.WRAP_CONTENT;
}
}
return LayoutParams.WRAP_CONTENT;
}
private static int decodeGravity(String s) {
if (s.equals(TOP)) {
return Gravity.TOP;
} else if (s.equals(BOTTOM)) {
return Gravity.BOTTOM;
} else if (s.equals(CENTER)) {
return Gravity.CENTER;
} else if (s.equals(RIGHT)) {
return Gravity.RIGHT;
} else if (s.equals(LEFT)) {
return Gravity.LEFT;
} else if (s.equals(CENTER_HORIZONTAL)) {
return Gravity.CENTER_HORIZONTAL;
} else if (s.equals(CENTER_VERTICAL)) {
return Gravity.CENTER_VERTICAL;
}
return Gravity.NO_GRAVITY;
}
}